无论使用什么方式对List进行遍历,都不能直接对List<E>变量进行直接修改操作,比如:
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的基础上添加的prev
系列方法,可以实现反向操作,最重要的是添加了add和set方法,可以实现遍历List的时候同时进行添加,修改的操作。
public interface ListIterator<E> extends Iterator<E> 系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。
List边遍历,边修改示例
public static void sop(Object obj){ System.out.println(obj); } public static void main(String[] args){ ArrayList a1 = new ArrayList(); a1.add("java01"); a1.add("java02"); a1.add("java03"); sop(a1); ListIterator li = a1.listIterator(); while(li.hasNext()){ Object obj = li.next(); if(obj.equals("java01")){ li.set("java009"); } } sop(a1); }
运行结果为:
[java01, java02, java03] [java009, java02, java03]
Iterator 迭代器
方法示例
ArrayList<Character> list = new ArrayList<>(); for (char c = 'A'; c <= 'G'; c++) { list.add(c); } Iterator<Character> it = list.iterator(); while (it.hasNext()) { char c = it.next(); // next() 返回下一个元素 if (c == 'C') { it.remove(); // remove() 移除元素 } else { System.out.print(c + ", "); } }
运行结果 :A,B,D,E,F,G
Iterator 的方法
方法 | 功能 |
---|---|
hasNext() | 判断集合列表中是否还有可以迭代的元素 |
next() | 返回下一个元素 |
remove() | 移除最近返回的一个元素 |
ListIterator 迭代器
方法示例
ArrayList<Integer> list = new ArrayList<>(); for (int i = 1; i <= 3; i++) { list.add(i); } ListIterator<Integer> li = list.listIterator(); boolean flag = true; // 如果是正序迭代 或者 有前一个可以迭代的元素 while (flag || li.hasPrevious()) { int index = 0; int ele = 0; if (flag) { index = li.nextIndex(); // nextIndex() 返回下一个元素的索引 ele = li.next(); // next() 返回下一个元素 } else { index = li.previousIndex(); // previousIndex 返回上一个元素的索引 ele = li.previous(); // previous() 返回上一个元素 } if (ele == 1) { // 如果迭代到的元素是 1 ,则将该元素替换成 0 li.set(0); // set() 用指定元素替换最后返回的元素 } else if (ele == 3) { li.remove(); // remove() 移除最后返回的元素 } System.out.println("(" + index + ") = " + ele); // 判断是否还有下一个可以迭代的元素 if (!li.hasNext()) { flag = false; li.add(10); // add() 添加一个元素 } }
运行结果
{0} = 1 {1} = 2 {2} = 3 {2} = 10 {1} = 2 {0} = 0
ListIterator 的方法
方法 | 功能 |
---|---|
hasNext() | 判断是否还有下一个元素可以迭代 |
next() | 返回下一个元素 |
hasPrevious() | 判断是否还有上一个元素可以迭代 |
previous() | 返回上一个元素 |
add() | 返回上一个元素 |
set(E e) | 用指定的元素替换最近返回的元素 |
remove() | 移除最近返回的元素 |
Iterator 和 ListIterator 主要区别
ListIterator有
add()
方法,可以向List中添加对象,而Iterator不能ListIterator和Iterator都有
hasNext()
和next()
方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()
和previous()
方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。ListIterator可以定位当前的索引位置,
nextIndex()
和previousIndex()
可以实现。Iterator没有此功能。ListIterator 可以再迭代时对集合进行
add
、set
、remove
操作,而Iterator
迭代器只能在迭代时对集合进行 remove 操作