解析List汇合子类ArrayList、Vector、LinkedList底层及扩容机制

ArrayList

特点

  • 高效率
  • 不平安
  • 有序

    扩容机制

    1.应用无参结构器初始化时,会创立一个elementData的空数组,没有初始容量.
    2.当调用汇合第一次进行add操作时,会进行以后数组elementData是否是空判断,如果为空,则造成一个最小所需容量为10的最小长度,随后则进行扩容,如果依据所需容量计算的后果小于0,则进行新容量的反赋值操作,随后则调用Arrays.copyOf办法进行数组的赋值,并且实现赋值。
    3.当所需容量大于10的时候,则依照现有容量的1.5倍进行扩容,并实现赋值。
    4.应用有参结构时则应用有参结构初始化elementData数组,当容量不够时,同上3

     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);  }

    Vector汇合

    特点

  • 低效率
  • 平安
  • 有序

    扩容机制

    1.应用无参结构初始化时,默认容量为10.

    /**   * Constructs an empty vector so that its internal data array   * has size {@code 10} and its standard capacity increment is   * zero.   */  public Vector() {      this(10);  }

    2.当所需容量小于现有容量时,会依照现有容量的2倍进行扩容

    private void grow(int minCapacity) {      // overflow-conscious code      int oldCapacity = elementData.length;      // 因为capacityIncrement默认为0,所以扩容等同于:现有容量+现有容量(2倍)      int newCapacity = oldCapacity + ((capacityIncrement > 0) ?                                       capacityIncrement : oldCapacity);      if (newCapacity - minCapacity < 0)          newCapacity = minCapacity;      if (newCapacity - MAX_ARRAY_SIZE > 0)          newCapacity = hugeCapacity(minCapacity);      elementData = Arrays.copyOf(elementData, newCapacity);  }

    3.调用Arrays.copyOf办法进行数组的复制,并实现赋值。