天剑汇 2017-05-17 02:04 采纳率: 0%
浏览 3168

Iterator 迭代删除元素问题

按照下面这种写法 ,迭代器删除和集合删除都不报错,
Iterator iterator = list.iterator();
while(iterator.hasNext()){
if("炉石传说".equals(iterator.next())){
list.remove(iterator.next());
// iterator.remove();
// list.remove(iterator.next());
}
}

但是按照下面这种写法,迭代器删除没问题,集合删除就报java.util.Concurrent ModificationExcept ion
错误了,请教下,这两种是由什么区别。
Iterator iterator = list.iterator();
while(iterator.hasNext()){
String string = iterator.next();
if("炉石传说".equals(string)){
list.remove(string);
// iterator.remove();
// list.remove(iterator.next());
}
}

  • 写回答

2条回答 默认 最新

  • -无-怨-无-悔- 2017-05-17 04:02
    关注

    其实你是没有理解迭代器的实际意义

    对于上面和下面的两个代码进行测试,其实只要用了list.remove();就都是错的,即使你的代码暂时不报错,也会存报错的安全隐患。

    举个例子(注意添加顺序):
    1.
    list.add("炉石传说");
    list.add("a");
    2.
    list.add("a");
    list.add("炉石传说");
    用上面的代码list测试1、2是都报错的,原因就是对于list的remove(iterator.next())会改变list的大小,同时却调用iterator.next(),也就是说在使用list的时候修改了list的大小,当然会出错
    如果要想上面的对于1不报错,则
    Iterator iterator = list.iterator();
    while(iterator.hasNext()){
    if("炉石传说".equals(iterator.next())){
    String s = iterator.next();
    list.remove(iterator.next());
    // iterator.remove();
    // list.remove(iterator.next());
    }
    }
    也就是先next,在remove

    用下面的代码list测试1、2, 1不报错,2报错,
    1的情况是原因在于list第一次删除字符串时仅仅只是减小list的大小,再次是不会遍历到下一个。
    2的情况是不会报java.util.Concurrent ModificationExcept ion 但是会报NoSuchElementExce,
    现在应该比较理解为什么要用迭代器而不用list直接删除了吧,就是因为list在遍历时会改变大小,发生冲突,而迭代器就像是指针,先指向你的上一个,如果说你有下一个,我在继续执行,没有我的指针就不往下走,所以是与长度无关的

    评论

报告相同问题?

悬赏问题

  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择
  • ¥15 这款软件是什么?需要能满足我的需求
  • ¥15 SpringSecurityOauth2登陆前后request不一致
  • ¥15 禅道二次开发编辑版本,上传不了发行包