美文网首页程序员
ArrayList动态扩容机制

ArrayList动态扩容机制

作者: 御风_2fd9 | 来源:发表于2020-06-20 11:48 被阅读0次

以ArrayList中add方法,讲解ArrayList动态扩容机制

  1. 扩容判断
    每次增加元素时,用size+1计算出作为需要最小的容器大小minCapacity,然后和容器大小elementData.length作比较,如果比elementData.length小,就要进行扩容。
  2. 扩容大小
    扩容时,将elementData.length作为oldCapacity,增大50%(oldCapacity >> 1),
    接着作两个判断
    如果增大后的值newCapacity还是小于minCapacity,就用minCapacity作为扩容值
    如果增大后的值newCapacity大于MAX_ARRAY_SIZE,就用Ar rayList最大可支持的容量hugeCapacity(minCapacity)

MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8

  1. 源码展示
 public boolean add(E e) {
      //size表示The size of the ArrayList (the number of elements it contains)
        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) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }

private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

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

/**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }

相关文章

网友评论

    本文标题:ArrayList动态扩容机制

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