美文网首页
【日拱一卒】ArrayList的add方法及扩容过程

【日拱一卒】ArrayList的add方法及扩容过程

作者: 写代码的杰西 | 来源:发表于2020-08-19 10:18 被阅读0次

    add方法

     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 void ensureExplicitCapacity(int minCapacity) {
            modCount++;
    
            // overflow-conscious code 
    //如果所需最小长度大于当前数组长度就扩容
            if (minCapacity - elementData.length > 0)
                grow(minCapacity);
        }
    

    扩容的grow方法

    private void grow(int minCapacity) {
            // overflow-conscious code
             //旧数组长度
            int oldCapacity = elementData.length;
          //新数组长度为旧数组长度1.5倍
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            //新数组长度仍小于所需长度,则用所需长度
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
          // 比int最大值-8 还大,就进入huge数组方法
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
            // minCapacity is usually close to size, so this is a win:
            //旧数组copy到新数组
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
    

    相关文章

      网友评论

          本文标题:【日拱一卒】ArrayList的add方法及扩容过程

          本文链接:https://www.haomeiwen.com/subject/iolrjktx.html