gpt4 book ai didi

java - 为什么从 ConcurrentHashMap 中删除第一个条目不会立即反射(reflect)在迭代器中,但删除第二个或后续条目是?

转载 作者:行者123 更新时间:2023-12-01 14:17:12 25 4
gpt4 key购买 nike

我创建了一个 iterator(),然后在迭代之前从 map 中删除了第一个条目。我总是得到从迭代器返回的第一个项目。但是当我删除第二个或后续条目时,当前迭代器不会返回该条目。

从 map 中删除第一个条目的示例:

    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 中删除第三个条目的示例:
    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

为什么从映射中删除第一个条目没有反射(reflect)在迭代器中,但删除第二个或后续条目是?

Java documentation说:

Iterators, Spliterators and Enumerations return elements reflecting the state of the hash table at some point at or since the creation of the iterator/enumeration. They do not throw ConcurrentModificationException.



这意味着,它的迭代器反射(reflect)了创建迭代器时哈希表的状态。
当我们在 Map 中添加或删除条目时,Iterator 将显示原始条目?

最佳答案

根据this迭代器和拆分器是弱一致的。 “弱一致”的定义见here :

Most concurrent Collection implementations (including most Queues) also differ from the usual java.util conventions in that their Iterators and Spliterators provide weakly consistent rather than fast-fail traversal:

  • they may proceed concurrently with other operations
  • they will never throw ConcurrentModificationException
  • they are guaranteed to traverse elements as they existed upon construction exactly once, and may (but are not guaranteed to) reflect any modifications subsequent to construction.


这意味着所做的任何修改 之后 可能会反射(reflect)已创建的迭代器,但不能保证。这只是并发迭代器\拆分器的正常行为。

关于java - 为什么从 ConcurrentHashMap 中删除第一个条目不会立即反射(reflect)在迭代器中,但删除第二个或后续条目是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61440727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com