簡體   English   中英

使用對象作為鍵的HashMap

[英]HashMap using Object as key

我幾天前發表了一篇關於在一個簡單的銀行程序中使用HashMap的文章,但是我在使用對象作為鍵時遇到了問題。

    HashMap <Account,Client> HM = new HashMap<Account, Client>();
    HM.put(new Account(2193,"Uri"), new Client(2193,0,"Uri"));
    HM.get(2193,"Uri");

客戶和客戶是源代碼其他部分中的類。 我的問題是HM.get無法正常工作,並給我一個錯誤。 我還有另一種“獲取”價值的方法嗎? 不確定如何使用密鑰。 請注意,HashMap的設置沒有錯誤。

此外,還有更好的方法嗎?

這會給你更好的主意。 這就是為什么您需要覆蓋哈希碼和equals方法的原因。

為什么需要重寫Java中的equals和hashCode方法?

覆蓋哈希碼和equals方法之后。

您需要在從hashMap獲取數據時使用對象。

HM.get(new Account(2193,"Uri"));

首先,此代碼無法編譯,因為您要將2個參數傳遞給get() ,而該參數只需要1個參數。

該參數應該是您在map使用的key ,並且必須與聲明地圖時聲明的類型相同,在這種情況下, HashMap <Account,Client> HM表示HM (按慣例,順便說一下,小寫)將Account類型的對象和Client類型的對象作為值作為鍵。

如果您這樣做,它仍然可以編譯:

get(2193)

由於get()需要一個Object但它只會返回null

您需要執行get(new Account(2193,"Uri"))

接下來,您無需在這些類中覆蓋equalshashCode ,但強烈建議您這樣做(其他人已經指出了原因)。 另外,根據文檔,您應該使鍵不變,這樣它們就不會更改,否則您可能會得到奇怪的行為。

注意:如果將可變對象用作地圖鍵,則必須格外小心。 如果在對象是映射中的鍵的情況下,以影響等值比較的方式更改對象的值,則不會指定映射的行為。 此禁止的一種特殊情況是,不允許地圖包含自身作為鍵。 雖然允許映射包含自身作為值,但建議格外小心:在此類映射上不再很好地定義equals和hashCode方法。

有關Map接口的更多詳細說明,請遵循Oracle的教程

暫無
暫無

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

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