[英]Why the javadoc of LinkedList does not guarantee constant time performance in pop and push?
[英]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的存儲區大小將其分配給存儲桶。 (請注意,存儲桶可能已被占用,這稱為沖突。這是優雅且正確的處理,但我會忽略對描述的處理,因為它不會改變概念)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.