public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hao");
list.add("hello");
for (String str : list) {
if("hello".equals(str)){
list.add("world");
}
}
System.out.println(list);
}
这段代码会抛出如下异常:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:907)
at java.util.ArrayList$Itr.next(ArrayList.java:857)
出现问题的原因就是在遍历的同时去增加元素,所以出现了并发修改异常
解决方法:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hao");
list.add("hello");
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {
String next = lit.next();
if ("hello".equals(next)) {
lit.add("world");
}
}
System.out.println(list);
}
打印结果:
[hao, hello, world]
看下 ListIterator 中的方法:
add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置之前
hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回 true,否则返回false
hasPrevious():如果以逆向遍历列表,列表迭代器前面还有元素,则返回 true,否则返回false
next():返回列表中ListIterator指向位置后面的元素
nextIndex():返回列表中ListIterator所需位置后面元素的索引
previous():返回列表中ListIterator指向位置前面的元素
previousIndex():返回列表中ListIterator所需位置前面元素的索引
remove():从列表中删除next()或previous()返回的最后一个元素(有点拗口,意思就是对迭代器使用hasNext()方法时,删除ListIterator指向位置后面的元素;当对迭代器使用hasPrevious()方法时,删除ListIterator指向位置前面的元素)
set(E e):从列表中将next()或previous()返回的最后一个元素返回的最后一个元素更改为指定元素e