2010-05-12 69 views

回答

112

java.util.HashMap是無序的順序;你不能也不應該承擔任何超出這一點的事情。

此類不保證作爲對地圖的順序;特別是,它不能保證訂單會隨着時間的推移保持不變。

java.util.LinkedHashMap使用插入順序。

該實施方式與HashMap不同,因爲它在所有條目中都保持一個雙向鏈接列表。這個鏈表定義了迭代排序,這通常是鍵被插入映射的順序(插入順序)。

java.util.TreeMapSortedMap,使用鍵的自然或自定義排序。

該地圖根據其按鍵的自然排序或在地圖創建時提供的Comparator進行排序,具體取決於使用哪個構造函數。

+1

,但Hashmap每次都遵循相同的可預測順序...爲什麼? – 2012-06-27 14:26:05

+0

@pop堆棧HashMap不保證順序。請參閱Stephen C的答案http://stackoverflow.com/questions/2144776/order-of-values-retrieved-from-a-hashmap瞭解有關如何以及爲何可能更改的詳細信息。 – 2012-12-24 18:12:07

+0

這些答案很棒!一張備忘單對於列出所有Map,List,Set in Java之間的區別是非常棒的! – 2013-03-20 13:38:47

5

HashMap不排序的。對於按鍵值排序的地圖,您應該使用TreeMap

從JavaDoc中TreeMap:基於

紅黑樹實現 SortedMap接口。此類 保證地圖將在 按鍵的升序,排序按照 自然秩序爲重點的 類(可比),或在創建時提供的 比較, 取決於其構造是 二手。

HashMap文檔:

此類不保證以 地圖的順序;特別是, 它不保證訂單 將隨着時間的推移保持不變。

+0

我從來沒有說過我想要他們排序。我想知道,如果java不是 – 2010-05-12 10:04:12

1

一個Map不是有序的數據結構 - 你不應該依賴於HashMap條目按照一定的順序之中。一些Map實現,如LinkedHashMapTreeMap做保證一定的秩序,但HashMap沒有。

如果你真的想知道什麼內部發生,查找HashMap的源代碼 - 你可以在src.zip這應該是在你的JDK安裝目錄中找到它。

HashMap具有多個在其中存儲其條目「桶」的。條目存儲在哪個桶由條目密鑰的哈希碼確定。您看到HashMap中條目的順序取決於密鑰的哈希碼。但是不要編寫依賴於條目在HashMap中按特定順序排列的程序 - 在將來的Java版本中實現可能會發生變化,並且您的程序將不再工作。

0

哈希表中沒有定義的順序。密鑰基於散列碼被放置在一個插槽中,但即使這不是一個簡單的逐個散列碼。

1

HashMap具有一個沒有定義的元素

14

首先:HashMap具體提供穩定的和/或所定義的排序。所以你觀察到的任何東西都只是一個實現細節,而你不能以任何方式依賴於其。

既然有時是有益的知道看似隨機排序的原因,這裏的基本思想是:

一個HashMap具有在其中存儲的條目桶的數量(如數組實現)。

當一個項目被添加到地圖中時,它將根據其hashCode派生的值和HashMap的存儲桶大小分配給一個存儲桶。 (請注意,桶可能已經被佔用,這被稱爲衝突,這是正常和正確的處理,但我會忽略處理描述,因爲它不會改變這個概念)。

感知到的排序(例如通過迭代Map返回)取決於這些桶中條目的順序。

每當大小被重新映射時(因爲映射超過了它的充滿度閾值),那麼桶的數量會發生變化,這意味着每個元素的位置可能會發生變化,因爲桶的位置也是從桶的數量。

0

HashMap使用使用部分密鑰生成的唯一散列值來存儲值。這個散列值映射到它將要存儲的地址。這是如何確保訪問O(1)。

另一方面LinkedHashmap保留了添加到地圖的順序。

+1

HashMap不能保證O(1)。它試圖做到最好,但在最壞的情況下,它是O(n),其中n =條目數(即使這不太可能(或者你的hashCode方法實施得很糟糕)) – Hardcoded 2010-05-12 11:52:04

+0

同意它並不總是提供一個恆定的時間表現,但往往不是,它確實嘗試着。 http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html – 2010-05-13 04:51:05

相關問題