天剑汇 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在遍历时会改变大小,发生冲突,而迭代器就像是指针,先指向你的上一个,如果说你有下一个,我在继续执行,没有我的指针就不往下走,所以是与长度无关的

    评论

报告相同问题?

悬赏问题

  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容