我剛剛開始在Java中實現數據結構,並想知道我們是否可以有這樣的情況。我們可以在其他地圖中使用嵌套地圖嗎?
Map<HashMap<String,String>,String> map = new HashMap<HashMap<String,String>,String>();
如果是的話,請舉個小例子。
如果沒有發現問題有關,,請提意見,
我剛剛開始在Java中實現數據結構,並想知道我們是否可以有這樣的情況。我們可以在其他地圖中使用嵌套地圖嗎?
Map<HashMap<String,String>,String> map = new HashMap<HashMap<String,String>,String>();
如果是的話,請舉個小例子。
如果沒有發現問題有關,,請提意見,
你可以做到這一點,但你不應該在大多數情況下這樣做。
映射關鍵字需要保持不變,並且需要設置其等號和哈希碼以提供正確的行爲。如果您在將密鑰添加到地圖後修改密鑰,則會使地圖無效。
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中的鍵的常量,否則你可以「丟失」這些鍵。
您不能使用地圖作爲重點,但你可以使用它作爲一個值。
爲了進一步解釋,由於您可能正在添加到HashMap,因此密鑰不會保持不變,因此將不再用作密鑰。
你可以有一個'Map'作爲鍵,但是正如你指出的那樣,因爲一個'Map'(通常)是可變的,所以鍵的改變。 – ooxi 2014-09-11 08:16:32
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的,否則不推薦使用。
謝謝,這正是我想要的.. – sagar 2014-09-11 08:50:31
我仍然沒有得到什麼問題在修改,請詳細說明 – sagar 2014-09-11 08:52:25
@sagar Elaborated ... – 2014-09-11 09:11:15
完美..... :) – sagar 2014-09-11 09:19:39