set集合可以添加重復元素


set集合判斷元素的唯一性要重寫hashcode和equals方法,這樣就能保證不會加入重復的元素,

但是在以下這種情況下任然可以加入重復元素,即使他們的hashcode和equals方法結果相同

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值去查找次對象,顯然查找不到 刪除失敗,

在重新添加 此對象時  任然可以加入,雖然他們的hashcode和equals相同 但是他們存儲在不同的位置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM