Iterator 循环 List remove元素报错的解决办法
来源:互联网 发布:php use function 编辑:程序博客网 时间:2024/05/16 17:17
原文链接:http://www.2cto.com/kf/201301/184791.html
List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); for (Iterator<Integer> iter = list.iterator(); iter.hasNext();) { int i = iter.next(); if (i == 3) { list.remove(i); } }
运行上边的代码就会报错:
原因:
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
网上找的解决方法:
1.倒过来遍历list
for (int i = list.size()-1; i >=0; i--) { int item = list.get(i); if (item == 3) { list.remove(item); } }
2.每移除一个元素以后再把i移回来
for (int i = 0; i < list.size(); i++) { int item = list.get(i); if (item == 3) { list.remove(item); i=i-1; } }
3.使用iterator.remove()方法删除
for (Iterator<Integer> iter = list.iterator(); iter.hasNext();) { int item = iter.next(); if (item == 3) { list.remove(item); } }
- Iterator 循环 List remove元素报错的解决办法
- Iterator 循环 List 使用remove方法报错的分析与解决办法。
- ArrayList删除元素(remove())报错的原理与解决办法
- for循环删除(ArrayList.remove)报错及解决办法
- for循环删除(ArrayList.remove)报错及解决办法
- 在for循环中remove list报错越界的问题
- java list中删除元素用remove()报错的fail-fast机制原理以及解决方案
- 不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁
- 使用Iterator的remove方法删除元素
- 遍历删除List中的元素,会报错? 用iterator.remove() 完美解决
- 关于list集合的remove和Iterator的remove
- 关于list集合的remove和Iterator的remove
- JAVA List循环队列删除元素/List.remove
- list.remove报错解决方案
- 关于JAVA中使用remove方法循环删除list中元素的常见误区
- 如何使用for循环和iterator循环remove掉list中的数据
- List在remove元素后报java.lang.UnsupportedOperationException
- 循环中使用List.remove的坑
- Qt程序运行自动弹出qtcreator_process_stub终端,关闭方法
- 详解Android中AsyncTask的使用(简单易懂)
- Ubuntu下安装svn服务器
- asp.net调用前台js调用后台代码分享
- asp 写提交表单到数据库
- Iterator 循环 List remove元素报错的解决办法
- 面试题33:把数组排成最小的数
- java 刷屏器
- 正则表达式
- Java web登录验证过滤器
- 网页排重算法(转)
- 二叉树
- linux内核中串口驱动注册过程(tty驱动)
- CentOS内核编译make menuconfig出错解决