从集合中删除()后,Iterator.hasNext()变得疯狂

Ole*_*eev 1 java

代码非常简单:

    List lst1 = new ArrayList(){{add("1");}};
    Iterator it = lst1.iterator();
    System.out.println(it.hasNext());
    it.next();
    System.out.println(it.hasNext());
    lst1.remove(0);
    System.out.println(it.hasNext());
Run Code Online (Sandbox Code Playgroud)

我知道你在迭代迭代器时不应该从集合中删除,请不要告诉我.

相反,请给我一个理智的解释为什么remove()操作会将hasNext()返回的值从false更改为true:

$ /usr/lib/jvm/sun-jdk-1.6/bin/java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Server VM (build 20.1-b02, mixed mode)

true
false
true
Run Code Online (Sandbox Code Playgroud)

hasNext()API文档明确指出,如果迭代器中有更多元素,它应该返回true,并且调用next()返回一个元素.输出证明SUN JDK 1.6不是这种情况

IBM JDK不这样做,hasNext 在调用remove()后返回false:

$ /usr/lib/jvm/ibm-jdk-bin-1.6/bin/java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build pxi3260sr9fp2-20110625_01(SR9 FP2))
IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 Linux x86-32 jvmxi3260sr9-20110624_85526 (JIT enabled, AOT enabled)

true
false
false
Run Code Online (Sandbox Code Playgroud)

Sun/Oracle hasNext()方法中是否存在错误?或者,IBM hasNext()方法中是否存在错误?或者,我不应该为此烦恼吗?

Boh*_*ian 5

迭代常规Collection时,必须使用Iterator.remove();删除当前元素.任何在迭代时修改(添加或删除)Collection的尝试都会抛出ConcurrentModificationException.

但是,有一些特殊的集合允许在迭代时对集合进行并发修改,例如CopyOnWriteArrayList等,但不支持对迭代器本身(删除,设置和添加)的元素更改操作(这些方法抛出UnsupportedOperationException).