繁体   English   中英

java.util.TreeMap行为问题

[英]java.util.TreeMap behavior question

类文档声明Entry s不能通过.setValue(...)修改,但也要注意put(...)工作正常。

这是否意味着put(...)在迭代像navigableKeySet()这样的集合视图时会正常工作(即,不会导致ConcurrentModificationException ),只要不进行结构修改(即添加新密钥)?

我正在测试它,但如果我无法打破迭代,我仍然想要一些验证它工作正常(而不是我无法打破它)。

TreeMap的javadoc状态:

结构修改是添加或删除一个或多个映射的任何操作; 仅仅改变与现有密钥相关联的值不是结构修改。

因此,可以假设允许在迭代该组键时改变与给定键相关联的值。

我相信你是对的,只要你没有通过添加新密钥进行结构修改,你就没有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执行。

(在TreeMapmodCount声明为private transiet ,但它在AbstractList模拟被声明为protected transient ,并且它的预期用途被记录为计算结构修改的数量,以便检测ConcurrentModificationException )。

此外, TreeMap文档明确说明了什么算作结构修改

结构修改是添加或删除一个或多个映射的任何操作; 仅仅改变与现有密钥相关联的值不是结构修改

基于以上所有,我会说是的,不添加新键/值对的put不是结构修改,因此不会导致ConcurrentModificationException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM