【发布时间】:2020-08-09 22:28:36
【问题描述】:
我创建了一个 iterator(),然后在迭代之前从地图中删除了第一个条目。我总是得到从迭代器返回的第一个项目。但是当我删除第二个或后续条目时,当前迭代器不会返回该条目。
从地图中删除第一个条目的示例:
Map<Integer,Integer> m1 = new ConcurrentHashMap<>();
m1.put(4, 1);
m1.put(5, 2);
m1.put(6, 3);
Iterator i1 = m1.entrySet().iterator();
m1.remove(4); // remove entry from map
while (i1.hasNext())
System.out.println("value :: "+i1.next()); //still shows entry 4=1
输出是:
value :: 4=1
value :: 5=2
value :: 6=3
从地图中删除第三个条目的示例:
Map<Integer,Integer> m1 = new ConcurrentHashMap<>();
m1.put(4, 1);
m1.put(5, 2);
m1.put(6, 3);
Iterator i1 = m1.entrySet().iterator();
m1.remove(6); // remove entry from map
while (i1.hasNext())
System.out.println("value :: "+i1.next()); //does not show entry 6=3
输出是:
value :: 4=1
value :: 5=2
为什么从映射中删除第一个条目没有反映在迭代器中,但删除第二个或后续条目是?
迭代器、拆分器和枚举返回的元素反映了在创建迭代器/枚举时或之后的某个时刻哈希表的状态。它们不会抛出 ConcurrentModificationException。
也就是说,它的迭代器反映了创建迭代器时哈希表的状态。 当我们在 Map 中添加或删除条目时,Iterator 会显示原始条目吗?
【问题讨论】:
标签: java collections concurrenthashmap