java迭代器使用集合方法删除倒数第二个元素为什么不报错

Smile小乖 2017-05-09 03:20:49
public class Demo01 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
list.add("zhaoliu");
Iterator it = list.iterator();
while (it.hasNext()) {
Object obj = it.next();
if ("wangwu".equals(obj)) {
list.remove(obj);
}
}
System.out.println(list);
}
}
运行结果
[zhangsan, lisi, zhaoliu]

如果删错其他元素:
public class ItaratorDemo01 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
list.add("zhaoliu");
Iterator it = list.iterator();
while (it.hasNext()) {
Object obj = it.next();
if ("zhaoliu".equals(obj)) {
list.remove(obj);
}
}
System.out.println(list);
}
}

运行结果抛出异常:


我知道使用迭代器遍历集合删除元素的时候不能使用集合的方法删除元素,但是为什么我第一次删除倒数第二个元素的时候捕获抛出异常呢?
...全文
651 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
110成成 2017-05-10
  • 打赏
  • 举报
回复 4
引用 2 楼 baidu_37996831 的回复:
[quote=引用 1 楼 zc881124 的回复:] 楼上的你好,我知道这个要用迭代器的remove方法删除元素,我只是不明白为什么这个用几个的删除倒数第二个元素不报错
首先你要去看下list 迭代具体是怎么操作的 可以看下AbstractList的源码。 迭代是以cursor为准,而list是根据size 是靠比较他们俩往下执行的。 为什么删除倒数第二个没有报错,因为 当删除倒数第二个时候,也就是迭代到list倒数第二个元素时,删除此元素, 这时hasNex 返回的false,也就是不往下再进行了,所以不会执行到 it.next(); 而next() 会检查cursor和size,才会报ConcurrentModificationException 你如果要问为什么hasNex 返回false,请看下hasNex 的实现 public boolean hasNext() { return cursor != size(); } 如果你还接着问 cursor 和size的值,那我建议你看源码了。。
Smile小乖 2017-05-10
  • 打赏
  • 举报
回复
[quote=引用 1 楼 zc881124 的回复:] 楼上的你好,我知道这个要用迭代器的remove方法删除元素,我只是不明白为什么这个用几个的删除倒数第二个元素不报错
110成成 2017-05-09
  • 打赏
  • 举报
回复
改成 public class Test9 { public static void main(String args[]) { List list = new ArrayList(); list.add("zhangsan"); list.add("lisi"); list.add("wangwu"); list.add("zhaoliu"); Iterator it = list.iterator(); while (it.hasNext()) { Object obj = it.next(); System.out.println("===" + obj); if ("zhaoliu".equals(obj)) { it.remove(); } } System.out.println(list); } } 建议你看下迭代器的源码实现 删除的时候下list 和Iterator 没有做到同步

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧