类文档声明Entry
s 不能通过修改.setValue(...)
但也可以put(...)
正常工作。
这是否意味着只要不进行结构修改(即添加新键),put(...)
迭代集合视图navigableKeySet()
(即不导致 a )时就可以正常工作?ConcurrentModificationException
我正在测试它,但如果我无法中断迭代,我仍然希望验证它工作正常(而不是我无法中断它)。
类文档声明Entry
s 不能通过修改.setValue(...)
但也可以put(...)
正常工作。
这是否意味着只要不进行结构修改(即添加新键),put(...)
迭代集合视图navigableKeySet()
(即不导致 a )时就可以正常工作?ConcurrentModificationException
我正在测试它,但如果我无法中断迭代,我仍然希望验证它工作正常(而不是我无法中断它)。
我相信你是对的,只要你不通过添加新密钥来进行结构修改,你就没有ConcurrentModificationException
.
也就是说,这样的代码在设计上是合法的:
NavigableMap<Integer,String> nmap =
new TreeMap<Integer,String>();
nmap.put(1, "One");
nmap.put(2, "Two");
nmap.put(3, "Three");
nmap.put(4, "Four");
nmap.put(5, "Five");
NavigableSet<Integer> nkeys =
nmap.navigableKeySet().subSet(2, true, 4, true);
for (Integer key : nkeys) {
nmap.put(key, "Blah");
}
System.out.println(nmap);
// prints "{1=One, 2=Blah, 3=Blah, 4=Blah, 5=Five}"
我也通过查看 OpenJDK 版本的源代码来支持这一点,只有在添加modCount++;
a 时才会执行new Entry
。
(在TreeMap
,modCount
被声明为private transiet
,但它的类似物 inAbstractList
被声明protected transient
,并且记录了它的预期用途以计算结构修改的数量以检测ConcurrentModificationException
)。
此外,文档TreeMap
明确阐明了什么是结构修改:
结构修改是添加或删除一个或多个映射的任何操作;仅更改与现有键关联的值不是结构修改
基于以上所有,我会说是的put
,不添加新键/值对的 a 不是结构修改,因此不会导致 a ConcurrentModificationException
。