new ArrayList的时候请指定长度

为什么 new ArrayList 的时候最好指定长度呢?

new ArrayList<>(20);

添加元素add(E e) 源码

public boolean add(E e) {
    //检测是否要扩容 参数是 当前数组长度 +  1
      ensureCapacityInternal(size + 1);  // Increments modCount!!
      elementData[size++] = e;
      return true;
}

再探扩容函数

//扩容方法
private void ensureCapacityInternal(int minCapacity) {
      ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}


//计算出一个值A、这个值呢用来和原数组长度比较、
private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
      return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}

//用A来和源数据长度做比较,如果 > 原数据长度 则要扩容
private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
      grow(minCapacity);
}

当调用ensureCapacityInternal(size + 1)的时候,Debug看下、

new ArrayList的时候请指定长度_第1张图片

再看grow(minCopacity)函数

new ArrayList的时候请指定长度_第2张图片

所以说初始化数组的时候尽可能的赋值长度,减少内存的申请和释放操作!

你可能感兴趣的:(java)