初始化
ArrayList的底层是⼀个动态数组,ArrayList⾸先会对传进来的初始化参数initalCapacity进⾏判断如果参数等于0,则将数组初始化为⼀个空数组,
如果不等于0,将数组初始化为⼀个容量为10的数组。 扩容时机
当数组的⼤⼩⼤于初始容量的时候(⽐如初始为10,当添加第11个元素的时候),就会进⾏扩容,新的容量为旧的容量的1.5倍。扩容⽅式
扩容的时候,会以新的容量建⼀个原数组的拷贝,修改原数组,指向这个新数组,原数组被抛弃,会被GC回收。//ArraList初始化容量判断
public void ensureCapacity(int minCapacity) {
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) 0 : DEFAULT_CAPACITY; if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity); } }
//添加元素的⽅法
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
//判断是否需要扩容
private void ensureExplicitCapacity(int minCapacity) { modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0) grow(minCapacity); }
//扩容的机制
private void grow(int minCapacity) { // overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity); }
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- ryyc.cn 版权所有 湘ICP备2023022495号-3
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务