无论使用什么方式对List进行遍历,都不能直接对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的基础上添加的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 的方法:
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 的方法
Iterator 和 ListIterator 主要区别
1.ListIterator有add()方法,可以向List中添加对象,而Iterator不能
2.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
3.ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
4.ListIterator 可以再迭代时对集合进行add、set、remove操作,而Iterator迭代器只能在迭代时对集合进行 remove 操作