你能告诉我为什么不在这个HashSet代码中调用equals()?

时间:2014-02-26 14:39:47

标签: java hashset

这是我测试HashSet的示例代码。 我希望结果是[3K,1K],但这段代码会产生[1K,3K,3K]

你能让我知道为什么代码不能调用等于吗?

import java.util.HashSet;

class SutdaCard{

    private int num;
    private boolean isKwang;

    SutdaCard(){
        this(1,true);
    }
    SutdaCard(int num, boolean isKwang){
        this.num = num;
        this.isKwang = isKwang;
    }

    public String toString(){
        return num+(isKwang ? "K":"");
    }

    public boolean equals(Object obj){
        String compareValue = obj.toString();
        String thisValue = toString();

        System.out.println("equals");

        return thisValue.equals(compareValue);
    }

    public int hashcode(){
        return toString().hashCode();
    }

}
class exercise11_11 {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub      

        HashSet<SutdaCard> set = new HashSet<SutdaCard>();


        set.add(new SutdaCard(3,true));
        set.add(new SutdaCard(3,true));
        set.add(new SutdaCard(1,true));

        System.out.println(set);

    }

}

1 个答案:

答案 0 :(得分:6)

您尚未正确覆盖hashCode()。试试:

@Override
public int hashCode() {
    return this.toString().hashCode();
}

由于Set使用了代码中hashCode()的{​​{1}},因此两个Object哈希码不匹配,SutdaCard永远不会调用。

如果添加equals()注释,编译器将检查您是否实际覆盖了某些内容,并在出现拼写错误时生成警告。