/**
* 案例: 有如下一个list集合,需求,遍历集合,当集合中等于"five"元素,那么就插入元素"four".
*
* 解决问题的过程中发现:
* 在迭代过程中,如果使用了集合的方法进行增删改查操作,那么迭代器会抛出 异常 ConcurrentModificationException.
原因是,迭代器不知道集合中的变化,容易发生调用的不确定性.
解决办法: 在迭代时,不要使用集合的方法进行操作元素.可以使用迭代器的子接口ListIterator<E>
里面有很多操作元素的方法.而且可以正向迭代,反向迭代.
*
* 记住****:该列表迭代器只有List接口有。
* 而且这个迭代器可以完成在迭代过程中的增删改查动作。(原因:因为List集合有角标)
* 列表迭代器列表ListIterator的概述:
* 允许程序员按任一方向遍历List、迭代期间修改List,并获得迭代器在List中的当前位置。
* ListIterator没有当前元素;它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。
* 长度为 n 的列表的迭代器有 n+1 个可能的指针位置.
*
* 具体方法用法,查看API ,Iterator 的子接口ListIterator
*/
public class ListIteratorDemo { public static void main(String[] args) { List list = new ArrayList(); list.add("one"); list.add("two"); list.add("three"); list.add("five"); /*for(Iterator it = list.iterator(); it.hasNext();){ Object obj = it.next(); if(obj.equals("five")){ 在迭代过程中,如果使用了集合的方法进行增删改查操作,那么迭代器会抛出异常. 原因是,迭代器不知道集合中的变化,容易发生调用的不确定性. 解决办法: 在迭代时,不要使用集合的方法进行操作元素. 可以使用迭代器的子接口ListIterator<E>中的方法就可以. 里面有很多操作元素的方法.而且可以正向迭代,反向迭代. * //list.add("four"); // 异常 ConcurrentModificationException } System.out.println(obj); }*/ //用ListIterator重新解决问题 for(ListIterator it = list.listIterator(); it.hasNext();){ Object obj = it.next(); if("three".equals(obj)){ it.add("four"); //[one, two, three, four, five] // it.set("3"); //[one, two, 3, five] //对比输出结果 } } System.out.println(list); } }
时间: 2024-11-05 06:54:32