ArrayList和Vector的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList和Vector的区别相关的知识,希望对你有一定的参考价值。

这些都是自己总结,若是有不对的地方请指出:

相同处:ArrayList和Vector底层都是用数组实现的

ArrayList源码里是这么写的:

    transient Object[] elementData;

    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

   public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

Vector源码:

    protected Object[] elementData;

    public Vector(int initialCapacity, int capacityIncrement) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);

  //这步说明他底层是数组结构如果是空构造那么默认的数组长度是10
        this.elementData = new Object[initialCapacity];
        this.capacityIncrement = capacityIncrement;
    }

    public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }

    public Vector() {
        this(10);
    }

先不用管代码有多复杂,看一下构造。

总结一下:第一个:Vector和ArrayList底层都是数组实现的。

      第二个就是若开始都是用空构造则默认的数组长度都为10

不同处:第一个:最明显的一个是Vector是线程安全的(通过实现synchronize方法)而ArrayList是线程不安全的

    第二个:ArrayList如果需要扩容新数组的长度是原来数组的1.5倍。而Vector是原来的两倍

Vector:

       public synchronized boolean add(E e) {
            modCount++;
            ensureCapacityHelper(elementCount + 1);
            elementData[elementCount++] = e;
            return true;
     }

       private void ensureCapacityHelper(int minCapacity) {
        if (minCapacity - elementData.length > 0)
                grow(minCapacity);
      }

      private void grow(int minCapacity) {
          int oldCapacity = elementData.length;

     //这里可以看出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);
      }

ArrayList:  

    public boolean add(E e) {
          ensureCapacityInternal(size + 1);  // Increments modCount!!
          elementData[size++] = e;
          return true;
      }

      private void ensureCapacityInternal(int minCapacity) {
          if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
              minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
          }

          ensureExplicitCapacity(minCapacity);
      }

     private void ensureExplicitCapacity(int minCapacity) {
          modCount++;
          if (minCapacity - elementData.length > 0)
              grow(minCapacity);
      }

      private void grow(int minCapacity) {
          int oldCapacity = elementData.length;

    //这里也可以看出ArrayList是1.5倍
          int newCapacity = oldCapacity + (oldCapacity >> 1);
          if (newCapacity - minCapacity < 0)
              newCapacity = minCapacity;
          if (newCapacity - MAX_ARRAY_SIZE > 0)
              newCapacity = hugeCapacity(minCapacity);
          elementData = Arrays.copyOf(elementData, newCapacity);
      }

ArrayList和Vector的扩容机制差不多,不清楚的同学可以去看看源码,一个看懂了另一个就不难了。

  

以上是关于ArrayList和Vector的区别的主要内容,如果未能解决你的问题,请参考以下文章

arrayList和vector的区别

27 ArrayList 和 Vector 的区别是什么?

ArrayList和Vector的区别

ArrayList和Vector的区别?HashMap和HashTable的区别?StringBuilderStringBuffer和String的区别?

Vector和ArrayList的联系和区别

ArrayList和Vector的区别