问题

有一次在测试时,发现程序报如下类似错误:

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
	at java.util.ArrayList$Itr.next(ArrayList.java:851)

原因

这是因为在使用for-each时,修改了for-each的对象(比如调用了remove())等。问题重现:

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(100);
        for (int i = 0; i < 100; i++) {
            list.add(i);
        }

        for (Integer i : list) {
            if (i % 2 == 0) {
                list.remove(i);
            }
        }
    }

一时写代码,又忘记这些基础了,归根结底,还是基础不够扎实。~~for-each只适合于遍历,则不能删除.

解决

如果确实想要修改,可以改为for(int i=0; i<list.size(); i++)这种形式.如:

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(100);
        for (int i = 0; i < 100; i++) {
            list.add(i);
        }
        for (int i = 0; i < list.size(); i++) {
            if (i % 2 == 0) {
                list.remove(i);
            }
        }
    }

或者使用iterator.如:

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(100);
        for (int i = 0; i < 100; i++) {
            list.add(i);
        }
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()){
            Integer i = iterator.next();
            if(i%2==0){
                iterator.remove();
            }
        }
        System.out.println(list);
    }