MST
星途 面试题库

面试题:Java中ArrayList迭代器的常规使用

请编写一段Java代码,使用ArrayList的迭代器遍历一个包含整数的ArrayList,并将每个元素乘以2后打印出来。同时,说明在使用迭代器遍历过程中,为什么不能直接使用ArrayList的remove方法删除元素,如果需要删除元素应该怎么做?
19.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListIteration {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            Integer num = iterator.next();
            System.out.println(num * 2);
        }
    }
}

在使用迭代器遍历过程中,不能直接使用ArrayListremove方法删除元素,原因如下:

  1. 并发修改异常:迭代器在遍历过程中维护了一个内部的期望修改计数(expectedModCount),它是在迭代器创建时记录的ArrayList的修改次数(modCount)。当使用ArrayListremove方法时,modCount会增加,但迭代器的expectedModCount不会更新。当迭代器的nextremove方法检测到modCountexpectedModCount不一致时,会抛出ConcurrentModificationException
  2. 索引错乱:直接使用ArrayListremove方法会改变列表的大小和索引,可能导致迭代器的遍历逻辑出现错误,比如跳过某些元素。

如果需要删除元素,应该使用迭代器自身的remove方法。示例如下:

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListRemoval {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            Integer num = iterator.next();
            if (num == 2) {
                iterator.remove();
            }
        }
        System.out.println(list);
    }
}

这样可以正确更新迭代器内部状态,避免ConcurrentModificationException,并且确保列表的一致性。