2014-09-24 34 views
2

從HashMap中檢索條目是否真的隨機化?或者是否依賴於其中條目被散列的桶,然後以某種預定義的順序訪問這些桶?或內部發生的其他任何類型的訂單?HashMap中元素的檢索順序是否真的隨機化?

+2

你的答案在這裏,如果你想閱讀... http://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html – StackFlowed 2014-09-24 14:50:14

+4

它不叫'RandomMap'。 – 2014-09-24 14:50:31

+0

另請參閱:http://stackoverflow.com/questions/2144776/order-of-values-retrieved-from-a-hashmap – assylias 2014-09-24 14:52:04

回答

6

應答b - 這取決於其中的條目被散列桶,然後將這些桶是在一些預定義的次序

2

訪問,當你調用一個HashMapget方法非空密鑰將會怎麼樣:

  1. 您的密鑰的hashCode()方法被調用。

  2. 該散列的散列桶是通過簡單地將散列與散列數-1進行比較而得到的,因爲該實現可以確保散列數總是2的冪。一個由HashMap.Entry對象組成的java數組,可以將生成的整數用作普通數組索引。這是O(1)複雜性來自的地方。

  3. 存儲桶中的條目(鏈接列表)被迭代,直到找到散列和鍵匹配所需的條目。這是O(1)複雜性開始惡化到O(n)的最壞情況的地方。

所以你可以看到,能夠有效利用HashMap會盡量減少在一個水桶一起結束的條目數。在這方面,所有重要的是散列碼中位從0到N-1的分佈,其中N是用於計算桶數的2的冪。您的散列碼中超過該限制的所有位都會被屏蔽掉,並且只能在存儲區列表的迭代過程中再次使用。

+0

對於你的第三點:我一直認爲'equals'方法被調用來解決衝突,即使你沒有明確地說出它也是這種情況(或者你的意思可能是「你要」) ? – Dici 2014-09-24 15:24:16

+0

@Dici,最終會.equals()將被調用,但實現首先嚐試通過首先對關鍵字執行引用相等性檢查來避免可能較慢的調用,並且它只會在先前計算出的hash匹配緩存的條目散列。 – 2014-09-24 15:47:49