1

我创建了这个程序。

    List<Integer> l = new ArrayList<>();
    l.add(1);
    l.add(5);
    l.add(112);

    Iterator i = l.iterator();      
    while(i.hasNext())
    {
        System.out.println(i.next());

    }
    Iterator ii = l.iterator();

    while(ii.hasNext())
    {
        System.out.println(ii.next());

    }

当我在调试时运行这个程序。

调试点是 on Iterator i = l.iterator();

此时,我通过进入 eclipse 的变量选项卡在列表中添加了一个整数。

我已经添加了Integer.valueof(34);.

现在当我完全运行这个程序时,它会打印

1
5
112
1
5
112

为什么第二个迭代器不打印34。它也没有给我一个ConcurrentModificationException例外。

谢谢。

4

2 回答 2

5

听起来您是直接l.elementData[3]从更改nullInteger. 由于您直接 - 并且不一致地 - 弄乱了类的内部,因此不能保证继续按照其合同行事。

在我的实现中,添加元素也需要更改l.size. fail-fast 机制依赖于l.modCount,需要递增。

换句话说,要ArrayList.add()手动模拟,您需要检查实现的源代码,并执行实际实现会执行的所有步骤。

于 2013-06-30T07:01:41.907 回答
0

ConcurrentModificationExceptions are fail-fast. So they are on a best effort basis. Essentially not guaranteed to throw up immediately.

于 2013-06-30T06:58:53.690 回答