hashSet在存放的对象的属性修改后,可以存重复的值

  1. hashSet集合存放一个自定义的对象时,对这个对象的属性进行修改时,在放一个和修改后的属性相同的对象,发现放进去,会有重复的现象,还可以放入修改前的对象。所以对于HashSet集合,想要修改一个对象,是先把原来的删除,在放一个新的,不能直接在原对象上修改。
  2. 存储过程 :通俗来说,就是根据存储对象的 hashcode值,存到hash表的相应位置,如果该位置已经被占了,就通过equals方法判断是否相同,相同就不存,不同就继续存放(并不覆盖原来的),所以我们在用hashset存储定义的对象时,一般都会重写hashCode方法 和equals方法。
    3.原因: 在修改后能存重复的是因为,当把一个对象A放到hash表中,在对它进行修改为B时,它的位置并不会改变,在存一个和改变后相同的对象B时,会根据这个对象的hashcode找相应位置,所以还是可以存入,再存对象A时
    ,根据hashCode发现hash表中已经有了,再根据equals进行比较,发现两者不同,所以也可以存进去。

    `public class Demo05Test {
    public static void main(String[] args) {
    Set dogs = new HashSet<>();
    dogs.add(new Dog(“wawa”,2));
    dogs.add(new Dog(“haha”,2));
    dogs.add(new Dog(“kaka”,2));
    dogs.add(new Dog(“wawa”,2));
    System.out.println(“第一次重复的存不进,证明已经重写了hashcode和equals方法”);
    System.out.println(dogs);

    for(Dog d : dogs) {   //对其中一个对象进行修改
        if(d.getName().equals("haha")) {  //把haha改成mimi
            //System.out.println(dogs.contains(d));
            d.setName("mimi");
            //System.out.println(dogs.contains(d));
        }
    }
    System.out.println("修改后的值");
    System.out.println(dogs);  
    dogs.add(new Dog("mimi",2));//在把mimi添加
    //dogs.add(new Dog("haha",2));
    System.out.println("又添加了和修改后属性相同的mimi");
    System.out.println(dogs);  //mimi重复
    
    /*for(Dog d : dogs) {
        if(d.getName().equals("mimi") && d.getAge()==2) {
            d.setName("haha");
        }
    }*/
    dogs.add(new Dog("haha",2));
    System.out.println("又添加了和修改前属性相同的haha");
    System.out.println(dogs);
    
    System.out.println("***************8");`
    }
    }
    

    结果

猜你喜欢

转载自blog.csdn.net/Lu_Xiao_Yue/article/details/82531881