天剑汇 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 孟德尔随机化结果不一致
  • ¥20 求用stm32f103c6t6在lcd1206上显示Door is open和password:
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法