2015-04-03 65 views
0

前幾天我做了一篇關於在簡單的銀行程序中使用HashMap的帖子,但我在使用Objects作爲鍵時遇到了問題。使用Object作爲鍵的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的設置沒有錯誤。

此外,有沒有更好的方法來解決這個問題?

+0

你實施了Account類equals和hashCode方法? – 2015-04-03 04:25:10

+3

您正在添加帳戶的對象,並嘗試使用整數。它不會工作。 – Pratik 2015-04-03 04:25:17

+0

您正在使用對象作爲關鍵。這將是你的對象的哈希代碼,而不是你的實際對象 – Nimesh 2015-04-03 04:25:39

回答

2

這會給你更好的主意。那就是爲什麼你需要重寫hashcode和equals方法。

Why do I need to override the equals and hashCode methods in Java?

壓倒一切的散列碼和equals方法之後。

你需要在從hashMap獲取數據的同時使用你的對象。

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

如果您認爲一個不同的SO問題回答了手頭的問題,您應該將其標記爲重複,不只是創建一個指向它的答案。此外,即使重寫這些方法,他的代碼也不會編譯。另一方面,如果正確使用,即使沒有覆蓋它們,get'也會在這種情況下起作用。 – 2015-04-03 04:53:08

+0

@MateuszDymczyk感謝您的建議。但我想這傢伙並不知道爲什麼我們需要重寫哈希碼並等於mehtod。所以這就是爲什麼我指出最好的例子,所以他/她可以學習基本原理。問題是不同的,所以這就是爲什麼我沒有把它標記爲重複的,並試圖給出方式,以便他/她能夠看得更遠,並且你解釋的方式非常好。感謝您提到的觀點。 – Pratik 2015-04-03 05:07:00

+0

在這種情況下發布這個評論將是去或回答他的問題的方式,並在答案中提到這一點作爲一個旁註 – 2015-04-03 05:09:19

0

的首先這個代碼,你逝去的2個參數get()其中預計只有1論點不編譯。

這樣的說法應該是你在map使用key並且必須同時宣告你的地圖,你的情況,你聲明的相同類型的HashMap <Account,Client> HM意味着HM(這順便說一句應按照約定小寫)持有的將Account類型的鍵對象和Client類型的對象作爲值。

它仍然會編譯,如果你做的事:

get(2193) 

由於get()需要一個Object,但它只會返回一個null。您需要做的是get(new Account(2193,"Uri"))

接下來,你不需要重寫這些類equalshashCode強烈推薦(別人已經指出,鏈接說明原因)。同樣根據doc你應該使鑰匙不可改變,所以他們不會改變,否則你可能會得到奇怪的行爲。

注意:如果可變對象用作地圖 鍵,則必須非常小心。如果對象 的值以影響等於比較的方式進行更改,而 對象是地圖中的關鍵字,則未指定地圖的行爲。這種禁令的一個特例是 地圖不允許自己作爲關鍵字。儘管 對於包含自身值的地圖是允許的,但建議您謹慎使用 :在這樣的地圖上,不再定義equals和hashCode方法 。

對於Map接口的更詳細的描述遵循Oracle's tutorial

相關問題