Java 为什么迭代器或listIterator的hasnext、hasprevious等方法不检查ConcurrentModificationException
我知道failfast迭代器会尽最大努力检查ConcurrentModificationException。为什么像hasnext或hasPrevious这样的方法不检查ConcurrentModificationException并抛出它 以下代码运行良好,其确切原因是,尽管已对其结构进行了修改,但这些方法未针对CME进行检查Java 为什么迭代器或listIterator的hasnext、hasprevious等方法不检查ConcurrentModificationException,java,collections,Java,Collections,我知道failfast迭代器会尽最大努力检查ConcurrentModificationException。为什么像hasnext或hasPrevious这样的方法不检查ConcurrentModificationException并抛出它 以下代码运行良好,其确切原因是,尽管已对其结构进行了修改,但这些方法未针对CME进行检查 public static void main(String[] args) { // TODO Auto-generated method stub
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> lilong = new ArrayList<String>();
lilong.add("Queen");
for(Iterator<String> iter =lilong.iterator();iter.hasNext();)
{
System.out.println(iter.next());
lilong.add("King");
lilong.remove(0);
lilong.add("Star");
lilong.remove(0);
lilong.add("Sun");
lilong.remove(0);
lilong.add("Polar Bear");
lilong.clear();
lilong.add("There you go");
}
System.out.println("size="+ lilong.size()+"##element##"+lilong.iterator().next());
}
publicstaticvoidmain(字符串[]args){
//TODO自动生成的方法存根
List lilong=new ArrayList();
加上(“女王”);
for(迭代器iter=lilong.Iterator();iter.hasNext();)
{
System.out.println(iter.next());
添加(“国王”);
移除(0);
添加(“星”);
移除(0);
加上(“太阳”);
移除(0);
加上(“北极熊”);
李龙;
lilong.add(“就是这样”);
}
System.out.println(“size=“+lilong.size()+”#####“+lilong.iterator().next());
}
编辑:删除一堆垃圾
所以问题是:为什么不像迭代器的其他方法那样,hasNext()
检查并发修改
如果我敢打赌,
hasNext()
没有多大用处,除非后面有一个next()
。因此,它不是在两个位置进行检查,而是在next()
hasNext
中,因为ArrayList的迭代器不检查修改,它只查看大小
如果您在列表中再添加一个元素,您将进入第二次迭代,然后next
将按预期失败
至于为什么会这样实施+1回答您的问题。我在这里没有看到任何迭代器。迭代器隐藏在for each语句中。@Kayaman我的意思是。for each循环由编译器内部推断为迭代器,for(字符串s:lilong)使用lilong.iterator()转换为代码。是的。。这就是重点。如果检查hasNext()方法的concurrentmodification异常,它肯定也适用于这种情况。迭代器只检查next()和remove()@AbhinavKumar的CME。我不确定您的代码实际要显示什么。即使hasNext()检查了CME,示例代码仍会像现在一样运行。我需要替换迭代器构造的代码,只有这样我才清楚他们会这样做,但hasNext()绕过了此检查。因此我想知道CME怎么会不会不会是caughtArrayList的javadoc说的“仅仅设置元素的值不是结构修改。”,因此list.set(0,“foo”)不会导致CME。哦,等等,这是讨论外部修改的部分,所以它可能仍然会导致CME。不,只是尝试了一下。set(index,obj)方法不会导致CME。是的,但它可以使用next()使用的此方法进行检查和remove()方法:-final void checkForComodification(){if(modCount!=expectedModCount)抛出新的ConcurrentModificationException();}这是从remove()和next()方法调用的,但不是从hasnext()方法调用的“yes,但它可以检查”。True。但它不是。