[英]Why doesn't the Java library provide `HashSet.get(Object o)` and `HashMap.getKey(Object o)`
[英]HashSet doesn't contain my custom object even though I override equals(Object o)
為什么這個程序的輸出是false
? 我期待true
n對象初始化與我正在檢查的相同的字符串。
public class Test {
public static void main(String[] args) {
Name n = new Name("jyoti", "meher");
Set<Name> s = new HashSet();
s.add(n);
System.out.println(s.contains(new Name("jyoti", "meher")));
}
}
class Name {
String name, title;
public Name(String name, String title) {
this.name = name;
this.title = title;
}
public boolean equals(Object o) {
if (!(o instanceof Name)) {
return false;
}
Name n = (Name) o;
return n.name.equals(name) && n.title.equals(title);
}
}
你也必須覆蓋hashCode()
,而不僅僅是equals()
。
要獲得正確的輸出true,您需要覆蓋Name類中的hashCode()方法
如果兩個對象具有不同的hashCode值,那么它們將被HashSet
視為不相等。
每當你重寫equals時,你也應該覆蓋hashCode()
以確保它是一致的。 在處理依賴哈希代碼分配對象的HashSet
和HashMap
時,這一點尤其重要。
您可以使用hashCode的以下(非最佳)實現來使用您的代碼:
@Override
public int hashCode() {
return 1;
}
這將強制HashSet
在比較Name
對象時使用equals()
方法。 如果在生成哈希碼時使用了name
和title
,則必須使用equals方法的情況會更少。
在Name類中,equal和hashcode方法都應該覆蓋。所以輸出將為true。
您應該重寫equals()和hashcode()方法,以確保合同得到滿足,以便將對象用作HashSet和HashMap等實現中的鍵。
您已正確覆蓋了等號。 您也可以覆蓋哈希碼,如下所示
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((name == null) ? 0 : name.hashCode());
result = prime * result + id;
result = prime * result
+ ((title == null) ? 0 : title.hashCode());
return result;
}
覆蓋哈希碼有助於根據哈希碼將對象存儲在不同的槽中,從而加快搜索速度。
希望這可以幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.