ArrayList初始化以及扩容机制

网上很多关于ArryList集合的说法,很多说法是错误的,自己详细记录一下

1.ArryList的初始化长度

  首先查看源码部分

  这是ArrayList 的构造方法,很明显,在初始化的时候,如果不传入参数的话,就是一个空数组,所以他初始化长度是 0!!!


public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
 

2.关于ArrayList的扩容机制

  2.1 add()方法

  源码上看,第一 ArryList 首次扩容会扩大10 的长度

  接下来看重点代码,最后总结出来,除了首次扩容是10,其次都是上次的1.5倍

  int newCapacity = oldCapacity + (oldCapacity >> 1);
  oldCapacity 之前的长度,那么这个计算公式就是 当前长度= 上次的长度+(上次长度除以2)) ,也就是 原长度的1.5 

private static final int DEFAULT_CAPACITY = 10;

1.添加
public
boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } 2.调用 private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } 3.首次条件是否扩容 private static int calculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; }

4.不是首次扩容
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);
}
 

  2.2 addAll()方法

  addAll的源码就不上了,直接说了,addAll 扩容是根据就近原则,选择最大值扩容

  1.第一次扩容小于10 ,那么直接扩容为10

  2.第一次扩容大于10.小于1.5 ,长度就是当前的集合长度

  3.二次扩容的时候 小于1.5 ,扩容其1.5倍

  4.二次扩容大于 1.5 长度就是当前集合长度

 

posted @ 2022-03-11 10:59  幽灵中的野孩子  阅读(603)  评论(0编辑  收藏  举报