代码如下
对 List
集合进行遍历,在满足某个条件时对集合进行修改,代码如下:
public class MyListDemo {
public static void main(String[] args) {
List<String> list = Lists.newArrayList("a", "b", "c", "d");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
if (next.equals("d")) {
iterator.set("f");
}
}
System.out.println("list = " + list);
}
}
最终输入结果如下:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911)
at java.util.ArrayList$Itr.next(ArrayList.java:861)
at org.apache.ibatis.gwmtest.current.MyListDemo.main(MyListDemo.java:19)
Process finished with exit code 1
发现会抛出 ConcurrentModificationException 异常,那么怎么才可以进行修改呢?可以借助 Iterator 接口的子类 ListIterator
操作,代码如下:
public class ListDemo {
public static void main(String[] args) {
List<String> list = Lists.newArrayList("a", "b", "c", "d");
ListIterator<String> iterator = list.listIterator();
while (iterator.hasNext()) {
String next = iterator.next();
if (next.equals("d")) {
iterator.set("f");
iterator.add("g");
}
}
System.out.println("list = " + list);
}
}
输出结果:
list = [a, b, c, f, g]
对集合的操作都是通过 ListIterator 对象,而不是 List 本身。
使用 ListIterator 可以避免 ConcurrentModificationException 异常,但也不是没有安全隐患?
下面列举了一些安全隐患:
-
遍历过程中的添加或删除操作可能导致错误:当使用 ListIterator 添加或删除元素时,可能会影响遍历过程中的枚举顺序,因此不推荐在遍历过程中进行添加和删除操作。
-
双向遍历:ListIterator 支持双向遍历,这意味着在遍历过程中可以向前和向后移动,如果不小心在遍历过程中修改了集合,可能会导致错误。
-
并发修改:ListIterator 是一个单线程工具,不支持并发修改,因此如果多个线程同时对集合进行修改,可能会导致不一致性问题。
因此,即使使用 ListIterator,仍然需要注意遍历过程中的集合操作,以确保程序的正确性。