1

类文档声明Entrys 不能通过修改.setValue(...)但也可以put(...)正常工作。

这是否意味着只要不进行结构修改(即添加新键),put(...)迭代集合视图navigableKeySet()(即不导致 a )时就可以正常工作?ConcurrentModificationException

我正在测试它,但如果我无法中断迭代,我仍然希望验证它工作正常(而不是我无法中断它)。

4

2 回答 2

2

TreeMap状态的 javadocs:

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

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

于 2010-06-28T19:12:37.307 回答
2

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

于 2010-06-28T19:13:17.833 回答