ArrayList源码学习
2023-06-08 16:37:13 0 举报
本文使用的 JDK 源码版本为 8,小伙伴如果发现文章中的源码和自己本地的不同时,不要担心,不是我源码贴错了,也不是你本地的源码错了,只是版本不同而已。
作者其他创作
大纲/内容
判断是否扩容minCapacity - elementData.length > 0
计算容量:ensureCapacityInternal(size + 1);
ArrayList 底层数据结构实现为数组核心属性:// 无参构造函数创建ArrayList,第一次add时,默认初始化数组大小10private static final int DEFAULT_CAPACITY = 10;// 有参构造函数 容量为0时默认空数组private static final Object[] EMPTY_ELEMENTDATA = {};// 无参构造函数创建时默认空数组private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};// 真正存储数据的数组transient Object[] elementData;// 当前存放元素大小private int size;
空间足够不用扩容
return true;
空数组,第一次add时newCapacity = minCapacity;
false
true
ArrayList
add后容量的大小 size+1return minCapacity
新数组比Integer.MAX_VALUE - 8整型最大值还大newCapacity - MAX_ARRAY_SIZE > 0
minCapacity
默认空数组赋值this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
确保足够的容量ensureExplicitCapacity(minCapacity)
放入元素到数组,并且size加1elementData[size++] = e;
list.add(e)
minCapacity 实际容量, elementData.length 扩容后的容量第一次:10(初始化容量),0,直接扩容第二次:2(实际容量),小于10 不扩容第三次:3(实际容量),小于10 不扩容....第11次:11(实际容量),大于扩容后的容量10, 扩容
使用整型最大值newCapacity = hugeCapacity(minCapacity);
数组的容量为:10(初始化)/span style=\"font-size: inherit;\
扩容grow(minCapacity);
minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE
扩容后新数组大小,为原数组的1.5倍int newCapacity = oldCapacity + (oldCapacity >> 1);
List list = new ArrayList()
旧数组大小int oldCapacity = elementData.length;
newCapacity - minCapacity < 0
无参构造函数时:第一次Add时elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
0 条评论
下一页