代码非常简单:
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()方法中是否存在错误?或者,我不应该为此烦恼吗?
迭代常规Collection时,必须使用Iterator.remove();删除当前元素.任何在迭代时修改(添加或删除)Collection的尝试都会抛出ConcurrentModificationException.
但是,有一些特殊的集合允许在迭代时对集合进行并发修改,例如CopyOnWriteArrayList等,但不支持对迭代器本身(删除,设置和添加)的元素更改操作(这些方法抛出UnsupportedOperationException).
| 归档时间: |
|
| 查看次数: |
2313 次 |
| 最近记录: |