hashSet在存放的物件的屬性修改後,可以存重複的值
阿新 • • 發佈:2019-02-12
- hashSet集合存放一個自定義的物件時,對這個物件的屬性進行修改時,在放一個和修改後的屬性相同的物件,發現放進去,會有重複的現象,還可以放入修改前的物件。所以對於HashSet集合,想要修改一個物件,是先把原來的刪除,在放一個新的,不能直接在原物件上修改。
儲存過程 :通俗來說,就是根據儲存物件的 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");` } }