[英]java.util.TreeMap behavior question
类文档声明Entry
s不能通过.setValue(...)
修改,但也要注意put(...)
工作正常。
这是否意味着put(...)
在迭代像navigableKeySet()
这样的集合视图时会正常工作(即,不会导致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++;
仅在添加new Entry
执行。
(在TreeMap
, modCount
被声明为private transiet
,但它在AbstractList
模拟被声明为protected transient
,并且它的预期用途被记录为计算结构修改的数量,以便检测ConcurrentModificationException
)。
结构修改是添加或删除一个或多个映射的任何操作; 仅仅改变与现有密钥相关联的值不是结构修改
基于以上所有,我会说是的,不添加新键/值对的put
不是结构修改,因此不会导致ConcurrentModificationException
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.