如何像Vector一样将ArrayList大小增加到100%

时间:2016-03-18 10:24:14

标签: java arraylist vector thread-safety

在根据SonarQube建议更改一些代码时,我会在下面的行中了解:

  
      
  1. 容量自动增加Vector默认为其数组的大小加倍。当您将一个元素插入ArrayList时,它   将阵列大小增加50%。
  2.   

现在我想知道是否需要用ArrayList替换Vector,可能会导致代码无法正常执行。

请记住现有的Vector没有做任何安全的工作。

问题:

  1. ArrayList是否足以像vector一样调整大小?

  2. 在除同步之外的任何条件下用ArrayList替换Vector是否安全?

  3. 是否有任何确切的Vector替换(不期望线程安全)

  4. 请随时更新问题或提出任何问题。

2 个答案:

答案 0 :(得分:2)

VectorArrayList之间的差异是这样的:

  1. Vector已同步,而ArrayList未同步。所以,Vector是线程安全的。
  2. Vector因为线程安全而很慢。相比之下ArrayList很快,因为它是非同步的。
  3. 默认情况下,Vector的数量增加一倍。当您将一个元素插入ArrayList时,它会将其数组大小增加50%。

    • ArrayList:

      /**
       * 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); // 50%
         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 void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                       capacityIncrement : oldCapacity); // default 100%
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
      }
      
  4. ArrayList未定义增量大小。 Vector定义增量大小。

        /**
         * The amount by which the capacity of the vector is automatically
         * incremented when its size becomes greater than its capacity.  If
         * the capacity increment is less than or equal to zero, the capacity
         * of the vector is doubled each time it needs to grow.
         *
         * @serial
         */
         protected int capacityIncrement;
    
  5. 基于以上内容:

    1. ArrayList无法像Vector一样调整大小。
    2. ArrayList不是线程安全的。它不能直接在多个线程中用Vector替换ArrayList
    3. 它主要可以在单个线程中用Vector替换ArrayList。因为声明VectorArrayList

      public class Vector<E>
          extends AbstractList<E>
          implements List<E>, RandomAccess, Cloneable, java.io.Serializable  
      
      
      public class ArrayList<E> 
          extends AbstractList<E>
          implements List<E>, RandomAccess, Cloneable, java.io.Serializable   
      

答案 1 :(得分:0)

我没有看到问题。 Vector和ArrayList的确切性能指标并不相同,但对于大多数实际目的而言,这并不重要。 ArrayList将在需要时扩展,并且比Vector更频繁(如果您事先没有告诉它所需的容量)。来吧。

如有问题:1。是2.是3.否