java for-each本质--不能增加和删除,但是可以修改当前元素
2016-12-21 22:35
507 查看
java for-each的本质是使用迭代器实现
1.案例
2.上面的代码会报ConcurrentModificationException异常
3.原因分析
每次进入for (String str : strLinkedList) 时,会调用java.util.LinkedList.ListItr.next()方法;
下面看一下checkForComodification()方法
因为checkForComodification()方法对集合的长度进行了判断,所以出现异常
4.躲避长度判断,执行增加和删除的方法。
在下一次进入循环之前就退出循环,这样就能既能实现增加和删除操作,又不会报错
输出结果
java for-each的本质是使用迭代器实现
1.案例
@Test public void testForEach() { List<String> strLinkedList = new LinkedList<>(); strLinkedList.add("aaaa"); strLinkedList.add("bbb"); strLinkedList.add("cccc"); System.out.println("strLinkedList.size:" + strLinkedList.size()); for (String str : strLinkedList) { System.out.println("strLinkedList.size:" + strLinkedList.size()); if (str.equals("aaaa")) { strLinkedList.remove("aaaa");//error,ConcurrentModificationException }else if(str.equals("cccc")){ strLinkedList.remove("cccc");//error,ConcurrentModificationException } str = "mmmm";//ok } }
2.上面的代码会报ConcurrentModificationException异常
3.原因分析
每次进入for (String str : strLinkedList) 时,会调用java.util.LinkedList.ListItr.next()方法;
public E next() { checkForComodification(); if (!hasNext()) throw new NoSuchElementException(); lastReturned = next; next = next.next; nextIndex++; return lastReturned.item; }
下面看一下checkForComodification()方法
final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); }
因为checkForComodification()方法对集合的长度进行了判断,所以出现异常
4.躲避长度判断,执行增加和删除的方法。
在下一次进入循环之前就退出循环,这样就能既能实现增加和删除操作,又不会报错
@Test public void testForEach() { List<String> strLinkedList = new LinkedList<>(); strLinkedList.add("aaaa"); strLinkedList.add("bbb"); strLinkedList.add("cccc"); System.out.println("strLinkedList.size:" + strLinkedList.size()); for (String str : strLinkedList) { if (str.equals("bbb")) { strLinkedList.remove("aaaa");// OK System.out.println("strLinkedList.size:" + strLinkedList.size()); break; } } System.out.println("strLinkedList.size:" + strLinkedList.size()); }
输出结果
strLinkedList.size:3 strLinkedList.size:2 strLinkedList.size:2
java for-each的本质是使用迭代器实现
相关文章推荐
- 为什么不能在ArrayList的For-Each循环中删除元素
- 006_002 Python 定义常量 可以添加新的属性,但是不能修改删除已有的属性
- oracle的在sql语句后加for update 不是都起作用的,对于单表是可以的,但是对于多表关联(无论left join还是内连接等)都不能修改
- JAVA操作XML的完整例子(查询、增加、修改、删除)
- 用java实现的双向链表增加删除修改操作
- PDF软件本来就是可以复制里面的文字的,但是不能修改
- SSH中,不能删除数据,可以添加,修改,查找
- java-集合类(3)-实现比较器(Comparator)接口-LinkedList针对插入删除、开始处增加元素
- LINQ To XML:获取,修改,增加,删除元素的属性
- 关于eclipse编写java代码时不能运行for-each语句的问题
- java数组:去重,增加,删除元素
- 通过js动态清空、增加、删除、修改下拉框中的元素
- 把eclipse里面的service服务全部删除,发现tomcat可以正常启动,但是不能运行tomcat
- Java环境配置好之后,cnd窗口Java可以执行,但是Javac不能执行
- 通过js动态清空、增加、删除、修改下拉框中的元素
- 为什么java中迭代过程中不可以不可以添加或删除元素
- 删除一个单项链表的最中间的元素,要求时间尽可能短(不能使用两次循环)java
- c语言使用链表编写一个可以实现班级学生管理系统,增加,删除,修改学生信息
- [JavaWeb基础] 004.用JSP + SERVLET 进行简单的增加删除修改
- java的接口不能实例化,但是有些函数可以这样写