import java.util.*;
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; }
}
public class HashSet中重复对象问题 {
    
    public static void main(String[] args) {
        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.print(set.size() + ":");
        k2.i = 1;
        System.out.print(set.size() + ":");
        set.remove(k1);
        System.out.print(set.size() + ":");
        set.remove(k2);
        System.out.print(set.size());
       
    }
}这里看来remove()只能删和参数值相同的。可是JAVA API中说:
public boolean remove(Object o)如果指定元素存在于此集合中,则将其移除。 意思应该是可以把这个元素删除啊……如果不能删除,想删除一个HashSet中的元素应该怎么办呢?- -

解决方案 »

  1.   

    你的理解可能有问题!!
    你的remove()是一个Set类的方法!!Set的remove()是key的方法;因此就是要删除参数值相同的元素啊!!
    你可以用list类来做就可以达到你要的效果!或是用ArrayList类来也可以!!
      

  2.   

    楼主如果想探究答案可以去看看HashSet的源代码。我也搞不明白这种情况到底发生了什么。
      

  3.   

    我不明白你清楚的地方是什么,只能给你解释下程序的运行过程了    public static void main(String[] args) {
            Set <KeyMaster> set = new HashSet <KeyMaster>();
            KeyMaster k1 = new KeyMaster(1);
            KeyMaster k2 = new KeyMaster(2);
            set.add(k1); //这步是吧k1对象放入了Set中了.
            set.add(k1); //在这步的时候,由于HashSet是本身是不允许有相同的对象的.这就牵扯怎么判断一个对象是不是相等了.
                           你这里equals(Object o) { return i == ((KeyMaster)o).i; }判断两个对象的i值是不是相等.
                           而你的i就是传入的1.所以这里不会插入这个对象了.
      
            set.add(k2);//插入k2对象.这里也是进行检查了,但是没有为2的值.所以插入了.
            set.add(k2);//插入失败,理由同前面说的情况一样.
            System.out.print(set.size() + ":");//打印Set中对象的个数.这里应该是2个.
            k2.i = 1;//把K2的i值设置为1,这是Set中的K2的i值已经发生了变化,这个变化会造成remove这个k2的时候会找不到了.因为在Set
                       中是靠hashCode来找的.而你的HashCode中又是通过i来判定了.所以你改了这个值会造成移动不了这个k2对象了.
            System.out.print(set.size() + ":");//这是打印出来,应该是2
            set.remove(k1);//移动k1对象
            System.out.print(set.size() + ":");//应该打印出1
            set.remove(k2);//试图移动k2,但是失败
            System.out.print(set.size());//打印出还是1
           
        }
      

  4.   

    结果对吗??这个是scjp的原题。我记得结果是2200呀不是2211..
    我知道hashset添加对象的时候是判断hashcode和比较equals,根据hashcode决定对象的位置,equals看重复不。
    那删除的时候是不是也要判断这两项呢??
    是不是删除一个对象时,先要判断hashcode找到对象的位置,再比较equals。
    k2的hashcode改的和k1相等了,equals也相等。
    让我产生这样一个想法,当改变k2的hashcode时,k2在hashset中的位置是不是也相应的改变了呢??