java.util.ConcurrentModification

2019-01-03  本文已影响0人  郝小永
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

上一篇 下一篇

猜你喜欢

热点阅读