2009-06-10 19 views

回答

42

通過調用

myMap.keySet().iterator(); 

你不應該甚至不需要知道它的存在得到它;這只是實施的一個神器。對於你所知道的,他們可以用飛猴來重複鍵盤;只要他們按照規範進行迭代,他們是如何做的並不重要。

順便問一下,你可知道,HashMap有一個名爲KeyIterator私有類(如做ConcurrentHashMapConcurrentSkipListMapEnumMapIdentityHashMapTreeMapWeakHashMap)?
這是否會影響您如何遍歷HashMap的密鑰?


編輯:在效應初探您的意見,要知道,如果你想在一個Map所有鍵 - 值對迭代,還有比遍歷鍵,並呼籲更好的辦法各爲get。方法entrySet()獲得所有鍵值對的Set,然後您可以迭代。因此,而不是寫:

for (Key key : myMap.keySet()) { 
    Value val = myMap.get(key); 
    ... 
} 

你應該寫:

for (Map.Entry<Key, Value> entry : myMap.entrySet()) { 
    doSomethingWithKey(entry.getKey()); 
    doSomethingWithValue(entry.getValue()); 
    ... 
} 

如果你願意,也可以與values()遍歷值。

注意,因爲keySetentrySet,並且valuesMap interface定義,他們會爲任何Map工作,不只是LinkedHashMap

+1

它只是沒有發生,我可以迭代一個LinkedHashMap,直到我看到內部私人類。但感謝您的答案。 – 2009-06-11 02:12:15

3

不應該使用定義爲LinkedHashMap的內部實現的一部分的任何東西(即在源代碼中但未在API中定義)。如果內部實施在下一個版本中發生變化,會發生什麼?所有使用它的代碼都會中斷。

你應該在代碼的API,並完成類似

myMap.keySet().iterator() 
3

這是一個私有類,所以你不能直接使用它。

private class KeyIterator extends LinkedHashIterator<K> { 

當您使用正常的Iterator時,會返回它的一個實例。

myMap.keySet().iterator()