开发者社区> 问答> 正文

源码描述ArrayList的扩容底层是如何实现的

源码描述ArrayList的扩容底层是如何实现的

展开
收起
huc_逆天 2021-01-08 16:01:50 649 0
1 条回答
写回答
取消 提交回答
  • 技术架构师 阿里云开发者社区技术专家博主 CSDN签约专栏技术博主 掘金签约技术博主 云安全联盟专家 众多开源代码库Commiter
    public boolean add(E e) {
         //扩容
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
        }
      private void ensureCapacityInternal(int minCapacity) {
          ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }
    
    private static int calculateCapacity(Object[] elementData, int minCapacity) {
            //如果传入的是个空数组则最小容量取默认容量与minCapacity之间的最大值
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
                return Math.max(DEFAULT_CAPACITY, minCapacity);
            }
            return minCapacity;
        }
        
      private void ensureExplicitCapacity(int minCapacity) {
            modCount++;
            // 如果最小需要空间比elementData的内存空间要大,则需要扩容
            // overflow-conscious code
            if (minCapacity - elementData.length > 0)
                grow(minCapacity);
        }
        
           private void grow(int minCapacity) {
            // 获取elementData数组的内存空间长度
            int oldCapacity = elementData.length;
            // 扩容至原来的1.5倍
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            //校验容量是否够
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
            //若预设值大于默认的最大值,检查是否溢出
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
            // 调用Arrays.copyOf方法将elementData数组指向新的内存空间
             //并将elementData的数据复制到新的内存空间
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
    
    2021-01-08 16:02:07
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载