这是我测试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);
}
}
答案 0 :(得分:6)
您尚未正确覆盖hashCode()
。试试:
@Override
public int hashCode() {
return this.toString().hashCode();
}
由于Set
使用了代码中hashCode()
的{{1}},因此两个Object
哈希码不匹配,SutdaCard
永远不会调用。
如果添加equals()
注释,编译器将检查您是否实际覆盖了某些内容,并在出现拼写错误时生成警告。