set集合能夠添加劇復元素

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

相關文章
相關標籤/搜索