2013-01-25 38 views
0

假設我有一個HashMap()定義和分配是這樣的:如何Map.entrySet()遍歷一個HashMap

private HashMap<Integer, Integer> rankCombinator=new HashMap<>(); 

我始終以「建設」與訪問前鍵和值HashMap中,例如我在它上面存儲了15個Integers作爲鍵和我想要的對應值。我想用for-each循環遍歷該地圖:

for(Map.Entry<Integer, Integer> entry : rankCombinator.entrySet()) 
{ 
    // More code here. 
} 

我想這個循環將不返回他們在首位被輸入的方式排序的值。我對嗎?如果是,那麼返回值中是否有任何模式? 我已經試過查看文檔,但它似乎並不像它包含此模式。

+1

您是不是指'Map.entrySet()'? –

回答

4

HashMap實施不保證有關項目返回的順序,我建議使用LinkedHashMap保留訂單。

private Map<Integer, Integer> rankCombinator=new LinkedHashMap<Integer, Integer>(); 

Api Documentation

+0

哦,我沒有注意到,我只知道鏈接列表。感謝您指出了這一點。你是否碰巧對我的問題有了一個答案,以及關於這種模式?出於好奇主要是... –

+0

HashMap實現不保證返回項目的順序。所以確實沒有模式。 –

1

簡短的回答,沒有。從javadoc:「這班不作任何保證,而地圖的順序」

這取決於在哈希表中桶的數量是任意的,並在桶元素的順序。因此,當發生重排時會發生變化。

如果您需要基於廣告訂單的可預測訂單,請使用LinkedHashMap

1

哈希映射根據密鑰的哈希碼將項存儲在「桶」中。 「普通」HashMap返回條目,因爲它在「散列桶」中找到它們。它沒有可辨別的模式,即使你找到它,它將嚴重依賴於實現和不可靠。

如果您需要可靠的迭代順序,請使用TreeMap(您將獲得按鍵排序的條目)或LinkedHashMap(您將獲得廣告訂單)。請注意,TreeMap有一個不同的機制來決定它的鍵的相等性,所以你要麼使鍵具有可比性,要麼提供一個比較器來處理鍵排序。

0

該順序是隨機的,但由散列函數決定,該函數將對象分配給散列映射數組存儲中的插槽。

更多關於這裏:How does a hash table work?