关于ArrayList的文章有两篇,前一篇写了ArrayList的数据结构、扩容机制、源码分析等,这篇来看一下ArrayList的一些操作细节。
删除元素操作
通过foreach删除
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
for (String element : list) {
System.out.println(element);
list.remove(element);//删除操作
}
使用foreach遍历数组,其实底层使用的Iterator,在Iterator创建的时候,维护了一个全局变量expectedModCount,将ArrayList的modCount赋值给expectedModCount。当list发生增、删、改的时候modCount会做递增,但是expectedModCount不会变。
Iterator在执行next方法的时候获取检测expectedModCount和modCount是否相等,当不相等的时候会抛出ConcurrentModificationException异常。由此可见,上面的代码在执行的过程中或出现异常的问题。
解释源码如下:
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount; //初始化expectedModCount,与modCount等
//……
}
public

本文详细探讨了ArrayList在Java中的删除元素操作,包括通过foreach和for循环删除的常见问题及解决办法。通过源码分析,指出在使用迭代器进行操作时能避免ConcurrentModificationException异常。同时,文章对比了扩容和移位的区别,帮助理解ArrayList内部的工作原理。
7833

被折叠的 条评论
为什么被折叠?



