我有以下的代碼,但我看到了在遍歷地圖鍵與keySet()
從地圖檢索值甚至與FindBugs的我得到的警告是錯誤WMI_WRONG_MAP_ITERATOR
避免map.get(key)方法
for(String elementId : mapElements.keySet()){
element = mapElements.get(elementId);
doSomething(element);
}
爲什麼這是不好的,我該如何解決它?
謝謝。
我有以下的代碼,但我看到了在遍歷地圖鍵與keySet()
從地圖檢索值甚至與FindBugs的我得到的警告是錯誤WMI_WRONG_MAP_ITERATOR
避免map.get(key)方法
for(String elementId : mapElements.keySet()){
element = mapElements.get(elementId);
doSomething(element);
}
爲什麼這是不好的,我該如何解決它?
謝謝。
如果你遍歷一切在地圖上,你不妨做:
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);
}
編輯:語法
而迭代地圖本身在從地圖檢索值是不是一個問題 - 怎樣成爲一個問題是,當你modiy同時迭代地圖。在你的情況下,這似乎並非如此,所以這本身並不危險。
當您迭代地圖時,您獲取的迭代器基於獲取迭代器時所有映射條目的快照。在隨後的中斷時,這個迭代器的行爲變得不確定。這是不好的。但是,在你的情況下,這不適用,因爲你沒有更新地圖。
另一點是,如果地圖很大,查找每個鍵的價值可能很昂貴。所以Jon Skeet的建議更有效率。不過,我承認用於迭代地圖入口集的代碼有點笨拙。
這當然在文檔中有解釋(http://findbugs.sourceforge.net/bugDescriptions.html#WMI_WRONG_MAP_ITERATOR) –