1. 程式人生 > >hashSet在存放的物件的屬性修改後,可以存重複的值

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");`
    }
    }
    

    結果