• Java ArrayList扩容机制


    来分析一下源码吧

    private static final int DEFAULT_CAPACITY = 10;
    
    • 1

    默认初始容量为10

    // 单个元素添加
    public boolean add(E e) {
            modCount++;
            add(e, elementData, size);
            return true;
        }
    
    // 批量add
    public boolean addAll(Collection<? extends E> c) {
         Object[] a = c.toArray();
         modCount++;
         int numNew = a.length;
         if (numNew == 0)
             return false;
         Object[] elementData;
         final int s;
         if (numNew > (elementData = this.elementData).length - (s = size))
             elementData = grow(s + numNew);
         System.arraycopy(a, 0, elementData, s, numNew);
         size = s + numNew;
         return true;
     }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    private Object[] grow(int minCapacity) {
       int oldCapacity = elementData.length;
        if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            int newCapacity = ArraysSupport.newLength(oldCapacity,
                    minCapacity - oldCapacity, /* minimum growth */
                    oldCapacity >> 1           /* preferred growth */);
            return elementData = Arrays.copyOf(elementData, newCapacity);
        } else {
            return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    总结

    • 当我们要 add 进第 1 个元素到 ArrayList 时,elementData.length 为 0 (因为还是一个空的 list),因为执行了 ensureCapacityInternal() 方法 ,所以 minCapacity 此时为 10。此时,minCapacity - elementData.length > 0成立,所以会进入 grow(minCapacity) 方法。
    • 当 add 第 2 个元素时,minCapacity 为 2,此时 elementData.length(容量)在添加第一个元素后扩容成 10 了。此时,minCapacity - elementData.length > 0 不成立,所以不会进入 (执行)grow(minCapacity) 方法。
    • 添加第 3、4···到第 10 个元素时,依然不会执行 grow 方法,数组容量都为 10。

    直到添加第 11 个元素,minCapacity(为 11)比 elementData.length(为 10)要大。进入 grow 方法进行扩容

    • 单个元素添加是按照1.5倍扩容
    • 批量添加是取size+numNew和1.5oldCapacity最大值
  • 相关阅读:
    数据库DQL数据查询语言
    图片翻译成中文怎么弄?分享三个图片翻译小技巧
    java毕业设计我爱短视频管理系统mybatis+源码+调试部署+系统+数据库+lw
    C++ 算数运算符 学习资料
    已解决:Ubuntu系统开启电脑一直出现Boot Menu
    类与对象(十一)----构造器
    elementUI 图片全屏预览
    试图替代 Python 的下一代AI编程语言:Mojo
    Spring @Transactional 与 JTA @Transactional
    什么是Python虚拟环境?
  • 原文地址:https://blog.csdn.net/davin12/article/details/132763158