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