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看下、

-

再看grow(minCopacity)函数

-

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。