2014-09-11 54 views
0

我剛剛開始在Java中實現數據結構,並想知道我們是否可以有這樣的情況。我們可以在其他地圖中使用嵌套地圖嗎?

Map<HashMap<String,String>,String> map = new HashMap<HashMap<String,String>,String>(); 

如果是的話,請舉個小例子。

如果沒有發現問題有關,,請提意見,

回答

5

可以做到這一點,但你不應該在大多數情況下這樣做。

映射關鍵字需要保持不變,並且需要設置其等號和哈希碼以提供正確的行爲。如果您在將密鑰添加到地圖後修改密鑰,則會使地圖無效。

HashMap可以被修改,所以不應該被用作關鍵字。

要解釋爲什麼改變它是一個問題,你需要知道hashmaps是如何工作的。這是非常簡單的,但可以說你有一個HashMap H包含兩個桶。讓我們稱他們爲B0和B1。

每當您將Object添加到HashMap時,它都會查看該對象hashCode。如果最後一位是0,那麼它進入B0,如果它是1,那麼它進入B1。

現在,當查找對象時,它會查看hashCode,並立即轉到右邊的存儲桶,然後只需搜索該存儲桶中的對象即可找到它需要的對象。

通過使用多於2個的桶,可以將每個桶中的物品數量減少2,4,8或更多倍,從而減少需要檢查的物體數量。

然而,讓我們說你把一個對象放在地圖上,它會被添加到B0。然後你改變對象,並且hashCode改變,所以現在的最後一位是1.

如果你做map.contains(obj)你會得到結果爲false,因爲它會查看hashCode,直接跳到B1,只掃描對象。但是該對象被放置在B0中,因爲這是hashCode在插入時的內容。

這就是爲什麼hashCode必須是任何對象被用作HashMap中的鍵的常量,否則你可以「丟失」這些鍵。

+0

我仍然沒有得到什麼問題在修改,請詳細說明 – sagar 2014-09-11 08:52:25

+0

@sagar Elaborated ... – 2014-09-11 09:11:15

+0

完美..... :) – sagar 2014-09-11 09:19:39

0

您不能使用地圖作爲重點,但你可以使用它作爲一個值。

爲了進一步解釋,由於您可能正在添加到HashMap,因此密鑰不會保持不變,因此將不再用作密鑰。

+0

你可以有一個'Map'作爲鍵,但是正如你指出的那樣,因爲一個'Map'(通常)是可變的,所以鍵的改變。 – ooxi 2014-09-11 08:16:32

1
HashMap<String, String> map = new HashMap<String, String>(); 
     HashMap<HashMap<String, String>, String> tMap = new HashMap<HashMap<String, String>, String>(); 
     map.put("1", "one"); 
     map.put("2", "two"); 
     tMap.put(map, "numbers"); 
     //for getting the value 
     Set description = tMap.entrySet(); 

使用iterator迭代值HashMap中值 實現這種類型的根據您的需求fucntionality的,否則不推薦使用。

+0

謝謝,這正是我想要的.. – sagar 2014-09-11 08:50:31