ArrayList 实现源码流程图
2023-04-17 16:43:12 9 举报
ArrayList 实现源码流程图,实现原理、扩容机制
作者其他创作
大纲/内容
判断是否扩容minCapacity - elementData.length > 0
false
ensureCapacityInternal(size + 1);
ensureExplicitCapacity(minCapacity)
放入元素到数组,并且size加1elementData[size++] = e;
ArrayList 底层数据结构实现为数组核心属性:// 无参构造函数创建ArrayList默认初始化数组大小private 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;
list.add(e)
true
使用整型最大值newCapacity = hugeCapacity(minCapacity);
空间足够不用扩容
return true;
使用原数组大小newCapacity = minCapacity;
扩容grow(minCapacity);
minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE
ArrayList
扩容后新数组大小,为原数组的1.5倍int newCapacity = oldCapacity + (oldCapacity >> 1);
下一个元素占用大小return minCapacity
minCapacity
新数组比Integer.MAX_VALUE - 8整型最大值还大newCapacity - MAX_ARRAY_SIZE > 0
默认空数组赋值this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
List list = new ArrayList()
旧数组大小int oldCapacity = elementData.length;
扩容后比原来小newCapacity - minCapacity < 0
判断当前数组是否是无参构建elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
0 条评论
下一页