class KeyMaster{
    public int i;
    public KeyMaster(int i){
        this.i = i;
    }
    
    public boolean equals(Object o){
        return i == ((KeyMaster)o).i;
    }
    
    public int hashCode(){
        return i;
    }
}
Set<KeyMaster> set = new HashSet<KeyMaster>();
KeyMaster k1 = new KeyMaster(1);
KeyMaster k2 = new KeyMaster(2);set.add(k1);
set.add(k1);
set.add(k2);
set.add(k2);
System.out.println(set.size());
k2.i = 1;
System.out.println(set.size());
set.remove(k1);
System.out.println(set.size());
set.remove(k2);
System.out.println(set.size()); // 此处结果为什么是1,请各位大侠们帮忙解答一下,尽量详细一点,谢谢了

解决方案 »

  1.   

    set.remove(k2)并没有把k2移除,所以set的size仍然是1一个对象在HashSet里的存放位置跟它的hashcode有关,k2放进去的时候,hashcode是2,所以会被存放在hashcode为2的"桶"里。
    后来k2的hashcode变成了1,在remove的时候就会到hashcode为1的桶里去找,但是找不到,因为k2存放的位置并没有变,还在hashcode为2的桶里。所以就不会把k2删除。