java.util.TreeMap行为问题

java.util.TreeMap行为问题,java,collections,treemap,Java,Collections,Treemap,类文档声明无法通过.setValue修改入口。。。但也要注意的是。。。很好 那是不是意味着。。。在对集合视图(如navigableKeySet)进行迭代时,只要不进行结构修改(如添加新键),是否可以正常工作,即不会导致ConcurrentModificationException 我正在测试它,但是如果我不能中断迭代,我仍然希望有一些验证,它工作得很好,而不是我无法破解它。 状态: 结构修改是添加或删除一个或多个映射的任何操作;仅更改与现有键关联的值不是结构修改 因此,可以假设允许在迭代一组键时

类文档声明无法通过.setValue修改入口。。。但也要注意的是。。。很好

那是不是意味着。。。在对集合视图(如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}"
我也在用modCount++;仅在添加新条目时执行

在TreeMap中,modCount是,但其在AbstractList中的模拟被声明为protected transient,其预期用途是检测ConcurrentModificationException

此外,还明确说明了什么是结构修改:

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


基于以上所述,我会说是的,不添加新键/值对的put不是结构修改,因此不会导致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}"
我也在用modCount++;仅在添加新条目时执行

在TreeMap中,modCount是,但其在AbstractList中的模拟被声明为protected transient,其预期用途是检测ConcurrentModificationException

此外,还明确说明了什么是结构修改:

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


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

+1-这些也是我检查的地方;只是想确保我没有错过任何东西;只是想确保我没有错过任何东西。+1和接受是最直接的答案@“Polygene润滑油”也有助于彻底性。+1和“接受”是最直接的问题答案@“多基因润滑油”也有利于彻底性。