簡體   English   中英

為什么HashMap不保證地圖的順序會隨着時間的推移保持不變

[英]Why HashMap does not guarantee that the order of the map will remain constant over time

我在這里閱讀Hashmap和Hashtable之間的區別: http ://javarevisited.blogspot.sg/2010/10/difference-between-hashmap-and.html

任何人都可以說明為什么它會跟隨?

“5. HashMap不保證地圖的順序會隨時間保持不變。”

在重新散列期間訂單是否會發生變化,這就是為什么?

如果你能指出資源或集合列表,表現出不保證秩序保持不變的行為,那也很好。

AFIK,ArrayList提供了這樣的保證(如果我錯了,請告訴我)

編輯:'地圖順序'=可能是輸入鍵或值的順序。

HashMap在任何時候都沒有訂單。 它實際上並不用於此目的。 即使沒有重復,訂單也可能會改變。

如果您需要使訂單保持不變,請使用LinkedHashMap

散列策略的要點是以偽隨機方式放置對象。 它這樣做是為了在大多數情況下,只有一個鍵/元素將被散列到給定的桶。 這允許O(1)查找時間。 當HashMap或Hashtable增長時,桶的數量發生變化,鍵/元素以另一種偽隨機方式放置。

最簡單的解決方案是使用LinkedHashMap。 這將保持添加順序或可選的上次訪問順序。 我更喜歡使用這個集合,因為它可以使調試變得更容易,因為我可以預測對象可能在哪里,有時添加對象的順序可能是有用的信息。

BTW如果您對多少訂單感興趣,那么少量密鑰可以在哈希集合中包含元素順序

對我來說,代碼如下:

Map <Integer, Object> map = new HashMap <Integer, Object> (4);

map.put (60, null);
map.put (48, null);
map.put (29, null);

System.out.println (map);

map.put (47, null);
map.put (15, null);
map.put (53, null);

map.remove (47);
map.remove (15);
map.remove (53);

System.out.println (map);

輸出:

{29=null, 48=null, 60=null}
{48=null, 29=null, 60=null}

由於在超過初始容量(此處為4)時發生的重新散列,訂單發生了變化。 即使再次刪除其他條目,也不會恢復原始訂單。

HashMap具有多個存儲條目的存儲桶(實現為數組)。

將項添加到地圖時,會根據其hashCode的值和HashMap的存儲區大小將其分配給存儲桶。 (請注意,存儲桶可能已被占用,這稱為沖突。這是優雅且正確的處理,但我會忽略對描述的處理,因為它不會改變概念)。

為什么HashMap不保證地圖的順序會隨着時間的推移保持不變

暫無
暫無

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

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