高级for循环使用remove/add 问题
来源:互联网 发布:淘宝台式机 编辑:程序博客网 时间:2024/05/17 15:59
今天在高级for循环中用了一下remove发现报错,写了个demo测试看:
List<String> a = new ArrayList<String>(); a.add("1"); a.add("2"); for (String temp : a) { if("1".equals(temp)){ a.remove(temp);} }
此时代码是没有问题的,运行正常;但是把”1”.equals(temp)换成”2”.equals(temp)之后,问题就出来了!
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) at java.util.ArrayList$Itr.next(ArrayList.java:851) at main.exam.ForeachTest.main(ForeachTest.java:15) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
报了这么一堆异常。
自己想了想画了个图:
看图就明白了,该list每当删除一个元素时,集合的size方法的值都会减小1,这将直接导致集合中元素的索引重新排序,进一步说,就是剩余所有元素的索引值都减1,正如上图所示,而for循环语句的局部变量i仍然在递增,这将导致删除操作发生跳跃。从而导致上述代码还有删除的问题。
所以不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。如下:
Iterator<String> it = a.iterator(); while(it.hasNext()){String temp = it.next(); if(删除元素的条件){ it.remove(); }}
1 0
- 高级for循环使用remove/add 问题
- 关于java for()循环 remove 的使用
- 关于java for()循环 remove 的使用
- easyUI accordion 使用和remove方法 for循环的异常
- Java_高级for循环
- 高级for循环
- 高级for循环 实例
- java_高级for循环
- java 高级for循环
- java 高级for循环
- 高级for循环
- 如何使用for循环和iterator循环remove掉list中的数据
- 循环例子-for高级应用
- 黑马程序员:高级for循环
- 黑马程序员-----高级for循环
- 高级for循环 练习笔记
- 黑马程序员--高级for循环
- 高级for循环:方便遍历
- MySQL 聚簇索引 和 非聚簇索引
- 屏幕自动旋转的问题
- H3 BPM让天下没有难用的流程之技术体系
- JSONKit 在iPad air还有iphone5S之后的设备上不工作
- Django shell测试
- 高级for循环使用remove/add 问题
- Dialog 1.08 SDK 实战 —— 搭建环境
- iOS原生地图基础(一)
- 好几年没有在csdn发帖了,回到这里又回到了上学时代的感觉,现在遇到一点麻烦,希望得到各位大神的帮助,小弟在这感激不尽
- VC 运行时库 /MD、/MDd 和 /MT、/MTd
- gitlab上删除项目
- ZCMU-1478
- android 右上角菜单无法显示
- 集合框架面试题