簡體   English   中英

Java:帶有兩個鍵的HashMap

[英]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使用項目作為鍵,則需要覆蓋它們的equalshashCode方法。 否則,默認實現將考慮使用相同參數創建的兩個實例,因為它們是兩個不同的實例。

目前:

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中的鍵:您應該至少將namedata設為final ,並使類也final使其成為真正不可變的。

Java VM使用Object.hashCode()和Object.equals(Object)比較對象,所以基本上它不知道如何比較Tarta對象,你需要覆蓋我提到的那些方法! Sory關於我的英語

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM