簡體   English   中英

Java - 從HashMap中檢索對象

[英]Java - Retrieving objects from HashMap

從hashmap中檢索值時出現問題。 hashmap聲明如下:

HashMap<TRpair,A> aTable = new HashMap<TRpair,A>();

然后我將112個值放入地圖中,如下所示:

aTable.put(new TRpair(new T(<value>),new Integer(<value>)),new Ai());

其中Ai是擴展A的4個子類中的任何一個。

然后我繼續檢查地圖中的值,如下所示:

int i = 0;
for (Map.Entry<TRpair,A> entry : aTable.entrySet()) {
    System.out.println(entry.getKey().toString() + " " + entry.getValue().toString());
    System.out.println(entry.getKey().equals(new TRpair(new T("!"),new Integer(10))));
    i++;
}

正如人們所預料的那樣,我在結尾處保持值112,並且正如預期的那樣,對於一個條目,相等性測試打印為真。

但是,當我這樣做的時候

System.out.println(aTable.get(new TRpair(new T("!"), new Integer(10))));

盡管上面的代碼片段確認地圖中確實存在一個恰好具有此鍵的條目,但仍輸出null。

如果有幫助,則TRpair類聲明如下:

public class TRpair {
    private final T t;
    private final Integer r;

    protected TRpair(Integer r1, T t1) {
        terminal = t1;
        row = r1;
    }

    protected TRpair(T t1, Integer r1) {
        t = t1;
        r = r1;
    }

    @Override
    public boolean equals(Object o) {
        TRpair p = (TRpair)o;
        return (p.t.equals(t)) && (p.r.equals(r));
    }

    @Override
    public String toString() {
        StringBuilder sbldr = new StringBuilder();
        sbldr.append("(");
        sbldr.append(t.toString());
        sbldr.append(",");
        sbldr.append(r.toString());
        sbldr.append(")");
        return sbldr.toString();
    }
}

Ai(擴展A)和T類中的equals()和toString()方法被類似地重寫並且看起來表現得如預期的那樣。

為什么從hashmap aTable輸出的值為null,之前已經確認相應鍵的值確實在地圖中?

非常感謝,

Froskoy。

哈希集合的鍵/元素,但如果覆蓋了euqals則覆蓋hashCode()。

你可以用。

public int hashCode() {
    return t.hashCode() * 31 ^ r.hashCode();
}

BTW:從你的代碼看來, Integer r不能為null在這種情況下使用int r更有意義。

來自Object.equals()

請注意,通常需要在重寫此方法時覆蓋hashCode方法,以便維護hashCode方法的常規協定,該方法聲明相等的對象必須具有相等的哈希代碼。

IIRC hashmap通過hashCode()而不是相等來查找,並且由於你沒有實現hashcode,你使用與對象指針相等一致的默認實現 - 你需要實現適當的hashcode函數,它考慮了“T”參數以及整數(或不)

好的做法是hashCode()和equals()是一致的,但如果你知道自己在做什么,則不需要在結構上。

暫無
暫無

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

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