我创建了这个程序。
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
例外。
感谢。
答案 0 :(得分:5)
听起来您正在将l.elementData[3]
从null
直接更改为Integer
。由于你直接 - 而且不一致 - 搞乱了班级的内部,因此不能保证继续按照合同行事。
在我的实现中,添加元素还需要更改l.size
。失败快速机制依赖于l.modCount
,需要递增。
换句话说,要手动模仿ArrayList.add()
,您需要检查实现的源代码,并执行实际实现的所有步骤。
答案 1 :(得分:0)
ConcurrentModificationExceptions失败快。所以他们是尽力而为的。基本上不能保证立即呕吐。