类文档声明Entrys 不能通过修改.setValue(...)但也可以put(...)正常工作。
这是否意味着只要不进行结构修改(即添加新键),put(...)迭代集合视图navigableKeySet()(即不导致 a )时就可以正常工作?ConcurrentModificationException
我正在测试它,但如果我无法中断迭代,我仍然希望验证它工作正常(而不是我无法中断它)。
类文档声明Entrys 不能通过修改.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。