在调试程序期间添加元素时为什么列表不会改变?

时间:2013-06-30 06:54:11

标签: java list collections arraylist

我创建了这个程序。

    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());

    }

当我在调试时运行该程序时。

调试点位于Iterator i = l.iterator();

此时,我已经在eclipse中的变量选项卡中添加了一个整数。

我添加了Integer.valueof(34);

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

1
5
112
1
5
112

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

感谢。

2 个答案:

答案 0 :(得分:5)

听起来您正在将l.elementData[3]null直接更改为Integer。由于你直接 - 而且不一致 - 搞乱了班级的内部,因此不能保证继续按照合同行事。

在我的实现中,添加元素还需要更改l.size。失败快速机制依赖于l.modCount,需要递增。

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

答案 1 :(得分:0)

ConcurrentModificationExceptions失败快。所以他们是尽力而为的。基本上不能保证立即呕吐。