[英]Java: HashMap with two keys
我正在嘗試用這種方式構建一個有兩個鍵的HashMap:首先我創建了一個只是數據結構的類。
public class Tarta {
public String nome;
public String data;
public Tarta(String nome, String data) {
this.nome = nome;
this.data = data;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
然后我通過在另一個類中寫這個來填充我的地圖:
mappaTarta.put(new Tarta(nome, data), peso);
在編譯期間我沒有錯誤,但是在測試時我得到了null,例如:
System.out.println(lr.leggiRecord().get(new Tarta("R", "15/11/2015")));
你能解釋一下為什么嗎? 謝謝
如果要在HashMap
使用項目作為鍵,則需要覆蓋它們的equals
和hashCode
方法。 否則,默認實現將考慮使用相同參數創建的兩個實例,因為它們是兩個不同的實例。
目前:
Tarta a = new Tarta("foo", "bar");
Tarta b = new Tarta("foo", "bar");
System.out.println(a == b); // false
System.out.println(a.equals(b)); // false
System.out.println(a.hashCode() == b.hashCode()); // false
示例實現:
@Override public boolean equals(Object other) {
if (other == this) return true;
if (other instanceof Tarta) {
Tarta that = (Tarta) other;
return Objects.equals(this.name, that.name)
&& Objects.equals(this.data, that.data);
}
return false;
}
@Override public int hashCode() {
return Objects.hash(name, data);
}
然后:
Tarta a = new Tarta("foo", "bar");
Tarta b = new Tarta("foo", "bar");
System.out.println(a == b); // false - they are still different instances
System.out.println(a.equals(b)); // true
System.out.println(a.hashCode() == b.hashCode()); // true
請注意,建議僅將不可變對象用作HashMaps中的鍵:您應該至少將name
和data
設為final
,並使類也final
使其成為真正不可變的。
Java VM使用Object.hashCode()和Object.equals(Object)比較對象,所以基本上它不知道如何比較Tarta對象,你需要覆蓋我提到的那些方法! Sory關於我的英語
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.