使用ListIterator 对List遍历时修改,删除
2016-11-07 21:31
239 查看
无论使用什么方式对List进行遍历,都不能直接对List<E>变量进行直接修改操作,比如:
上面的代码想在“john”后面添加“Davien”,但是很不幸,会抛出java.util.ConcurrentModificationException异常,就是因为对在循环中对strList变量进行直接修改。Iterator可以提供容器类的统一遍历方式,并且可以在遍历中使用remove方法删除元素,但是任然不能解决遍历时修改List的需求,ListIterator在Iterator的基础上添加的pre系列方法,可以实现反向操作,最重要的是添加了add和set方法,可以实现遍历List的时候同时进行添加,修改的操作。请看例子。
输出结果如下:
List<String> strList = new ArrayList<String>(); strList.add("john");strList.add("mark"); strList.add("alen");strList.add("jason"); for(String strElem:strList) { if(strElem.equals("john")) { strList.add("Davien"); } }
上面的代码想在“john”后面添加“Davien”,但是很不幸,会抛出java.util.ConcurrentModificationException异常,就是因为对在循环中对strList变量进行直接修改。Iterator可以提供容器类的统一遍历方式,并且可以在遍历中使用remove方法删除元素,但是任然不能解决遍历时修改List的需求,ListIterator在Iterator的基础上添加的pre系列方法,可以实现反向操作,最重要的是添加了add和set方法,可以实现遍历List的时候同时进行添加,修改的操作。请看例子。
package cn.jnk.tools; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import org.junit.Test; /** * Unit test for simple App. */ public class AppTest { @Test public void ListTest() { boolean doExceptionTest = false; List<Phone> phones = new ArrayList<Phone>(); phones.add(new Phone("111")); phones.add(new Phone("183")); phones.add(new Phone("182")); phones.add(new Phone("185")); System.out.println("原始数据"); for(Phone phoneElem:phones) { System.out.println(phoneElem.getNumber()); } ListIterator<Phone> phoneIterator = phones.listIterator(); while(phoneIterator.hasNext()) { Phone tmpPhone = phoneIterator.next(); if(tmpPhone.getNumber().equals("111")) { tmpPhone.setNumber("666"); phoneIterator.set(tmpPhone); phoneIterator.add(new Phone("132")); // use ListIterator add item is ok } if(tmpPhone.getNumber().equals("183")) { phoneIterator.remove(); } if(doExceptionTest) { phones.add(new Phone("170")); // throw java.util.ConcurrentModificationException } } System.out.println("\n修改后正向遍历:"); for(Phone phoneElem:phones) { System.out.println(phoneElem.getNumber()); } System.out.println("\n修改后反向遍历:"); //反向遍历 while(phoneIterator.hasPrevious()) { System.out.println(phoneIterator.previousIndex() + ": "+phoneIterator.previous().getNumber()); } } } class Phone { private String number; public Phone(){} public Phone(String number) { this.number = number; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }
输出结果如下:
相关文章推荐
- 黄聪:C#使用能够foreach对hashtable、List遍历时“集合已修改;可能无法执行枚举操作。”错误
- 在list集合中的添加、修改、删除和遍历元素
- 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析
- tinyxml使用:创建XML,遍历打印xml文件 select操作,获取单个节点值,删除节点操作,修改节点操作,增加节点操作
- 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析
- 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常的解决办法
- 遍历list时删除某些情况下的元素,使用迭代器Iterator
- 迭代器ListIterator使用及并发修改List集合
- 使用 forEachIndexed 带下标遍历 list;这样我们可以使用 forEach 来修改 list 的元素了
- 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析
- ios NSDictionary NSMutableDictionary 使用例子 初始化 遍历 删除 修改
- 黄聪:C#使用能够foreach对hashtable、List遍历时“集合已修改;可能无法执行枚举操作。”错误
- 如何在遍历中使用list的删除函数
- 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析
- 如何在遍历list,vector,map时删除符合条件的元素
- 使用xom实现xml文件数据的查找,删除,修改(完整beta版,daya原创)
- 每次重启Tomcat后,使用Hibernate修改数据库的记录都会导致以前记录被删除的解决办法。
- C++ builder 2007 使用ADO数据库 进行 添加 删除 修改
- 使用foreach,list来遍历数组
- oracle中使用alter table来增加、删除、修改列的语法