set集合判斷元素的惟一性要重寫hashcode和equals方法,這樣就能保證不會加入重複的元素,ide
可是在如下這種狀況下任然能夠加入重複元素,即便他們的hashcode和equals方法結果相同this
public static void main(String[] args) { Set<Person> set = new HashSet<Person>(); Person p1 = new Person("p1",123); Person p2 = new Person("p2",123); Person p3 = new Person("p3",123); set.add(p1); set.add(p2); set.add(p3); Iterator<Person> it= set.iterator(); while(it.hasNext()){ Person p = it.next(); System.out.println(p.getName()+":"+p.getAge()); } p3.setAge(20); set.remove(p3); set.add(p3); System.out.println("---------------------"); it= set.iterator(); while(it.hasNext()){ Person p = it.next(); System.out.println(p.getName()+":"+p.getAge()+":"+p.hashCode()); } }
class Person{ private String name; private int age; public Person(){ } public Person(String name, int age) { this.name = name; this.age = age; } /** * 返回 * @return */ public String getName() { return name; } /** * 設置 * @param */ public void setName(String name) { this.name = name; } /** * 返回 * @return */ public int getAge() { return age; } /** * 設置 * @param */ public void setAge(int age) { this.age = age; } @Override public int hashCode() { return this.age; } @Override public boolean equals(Object obj) { if(obj instanceof Person){ Person p = (Person) obj; return p.getName().equals(this.getName()); } return false; } }
在修改set中元素屬性值(hashcode值)在去刪除這個元素時就刪除不掉 由於它會根據修改以後的hashcode值去查找次對象,顯然查找不到 刪除失敗,spa
在從新添加 此對象時 任然能夠加入,雖然他們的hashcode和equals相同 可是他們存儲在不一樣的位置code