[英]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"))
。
接下來,您無需在這些類中覆蓋equals
和hashCode
,但強烈建議您這樣做(其他人已經指出了原因)。 另外,根據文檔,您應該使鍵不變,這樣它們就不會更改,否則您可能會得到奇怪的行為。
注意:如果將可變對象用作地圖鍵,則必須格外小心。 如果在對象是映射中的鍵的情況下,以影響等值比較的方式更改對象的值,則不會指定映射的行為。 此禁止的一種特殊情況是,不允許地圖包含自身作為鍵。 雖然允許映射包含自身作為值,但建議格外小心:在此類映射上不再很好地定義equals和hashCode方法。
有關Map
接口的更多詳細說明,請遵循Oracle的教程
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.