乐趣区

关于数组:List集合底层解析

解析 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 办法进行数组的复制,并实现赋值。

退出移动版