面试题答案
一键面试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);
}
}
}
在使用迭代器遍历过程中,不能直接使用ArrayList
的remove
方法删除元素,原因如下:
- 并发修改异常:迭代器在遍历过程中维护了一个内部的期望修改计数(
expectedModCount
),它是在迭代器创建时记录的ArrayList
的修改次数(modCount
)。当使用ArrayList
的remove
方法时,modCount
会增加,但迭代器的expectedModCount
不会更新。当迭代器的next
或remove
方法检测到modCount
和expectedModCount
不一致时,会抛出ConcurrentModificationException
。 - 索引错乱:直接使用
ArrayList
的remove
方法会改变列表的大小和索引,可能导致迭代器的遍历逻辑出现错误,比如跳过某些元素。
如果需要删除元素,应该使用迭代器自身的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
,并且确保列表的一致性。