2011-09-27 75 views
11

我有以下的代碼,但我看到了在遍歷地圖鍵與keySet()從地圖檢索值甚至與FindBugs的我得到的警告是錯誤WMI_WRONG_MAP_ITERATOR避免map.get(key)方法

for(String elementId : mapElements.keySet()){ 

    element = mapElements.get(elementId); 

    doSomething(element); 
} 

爲什麼這是不好的,我該如何解決它?

謝謝。

+4

這當然在文檔中有解釋(http://findbugs.sourceforge.net/bugDescriptions.html#WMI_WRONG_MAP_ITERATOR) –

回答

23

如果你遍歷一切在地圖上,你不妨做:

for (Map.Entry<String, String> entry : mapElements.entrySet()) { 
    String key = entry.getKey(); 
    String value = entry.getValue(); 
    // Use the key and the value 
} 

或者,如果你真的不需要鍵,只需遍歷值:

for (String value : mapElements.values()) { 
    doSomething(value); 
} 

編輯:語法

0

而迭代地圖本身在從地圖檢索值是不是一個問題 - 怎樣成爲一個問題是,當你modiy同時迭代地圖。在你的情況下,這似乎並非如此,所以這本身並不危險。

當您迭代地圖時,您獲取的迭代器基於獲取迭代器時所有映射條目的快照。在隨後的中斷時,這個迭代器的行爲變得不確定。這是不好的。但是,在你的情況下,這不適用,因爲你沒有更新地圖。

0

另一點是,如果地圖很大,查找每個鍵的價值可能很昂貴。所以Jon Skeet的建議更有效率。不過,我承認用於迭代地圖入口集的代碼有點笨拙。