[英]Iterator for ConcurrentHashMap giving strange result
ConcurrentHashMap是線程安全的。 因此,如果在迭代時添加任何要映射的值,則不應考慮它們。 下面是我的代碼:
public class Test {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
map.put("ONE", 1);
map.put("TWO", 2);
Iterator<String> it = map.keySet().iterator();
while (it.hasNext()) {
String key = (String) it.next();
System.out.println(key + " : " + map.get(key));
map.put("9", 10); // This should not be reflected in the Iterator
map.put("5", 10); // This should not be reflected in the Iterator
}
}
}
TWO : 2
ONE : 1
9 : 10
我的問題是為什么迭代器考慮map.put(“ 9”,10);?
ConcurrentHashMap是線程安全的。 因此,如果在迭代時添加任何要映射的值,則不應考慮它們。
那是不對的。 這是javadoc所說的:
“類似地,迭代器,拆分器和枚舉返回在創建迭代器/枚舉時或此后某個時刻反映哈希表狀態的元素。”
注意“或自”!
它還表示迭代器“弱一致性”,這意味着:
“保證它們會遍歷在構造時已經存在的元素一次,並且可能(但不保證)反映出構造后的任何修改。”
簡而言之,您期望的是Javadocs顯然沒有的迭代器的屬性。
ConcurrentHashMap是線程安全的 ,但這是另一種情況。
一個列表,你可以使用帶有ListIterator.Add這是專為的ListIterator。
使用HashMap,我看到兩個解決方案:
轉換為列表,然后返回到HashMap
循環結束后,對新元素使用附加的HashMap,然后使用另一個循環添加所有新元素(雖然不太優雅,但是可以!)。
對於Java 8,您可以考慮使用lambda-expressions來簡化代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.