ArrayList
2022-07-19 11:16:50 0 举报
ArrayList 源码详解
作者其他创作
大纲/内容
transient Object[] elementData; //保存集合内元素
int newCapacity = oldCapacity + (oldCapacity >> 1);尝试扩容1.5倍
https://blog.csdn.net/qq_44613591/article/details/114108920之所以这么处理的原因
ArrayList的核心方法
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
可以看到迭代器初始化的时候,会记录集合被修改的次数,而每次获取下一个元素时,都会判断被修改的次数是是否变化,如果变化了会抛出异常checkForComodification()throw new ConcurrentModificationException所以在集合遍历的过程中,不能对集合进行增 删 改操作
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
next()
add(E e)
两个线程同时计算出还有一个位置无需扩容,但最终只会有一个插入成功,另一个会失败抛出异常。线程不安全
用计算出来的需要的集合大小和当前集合大小比较,如果小于当前大小不用操作,如果大于当前大小,进行扩容
迭代器相关逻辑
modCount记录集合的修改次数,这里会自增一次
显然一直扩容会存在大量的数据拷贝,所以如果已知集合会存大量数据的情况下,会一开始就初始化好集合的大小
calculateCapacity计算需需要多少的空间
ArrayList内部的数组元素为什么被定义为transient
ensureCapacityInternal扩容方法,参数是表示即将申请的集合大小
List<String> list = new ArrayList<String>(); list.add(\"TEST1\"); list.add(\"TEST2\"); list.add(\"TEST3\"); list.add(\"TEST4\"); list.add(\"TEST6\"); list.add(\"TEST5\");
扩容逻辑
收藏
收藏
0 条评论
下一页