码迷,mamicode.com
首页 > 其他好文 > 详细

ArrayList和Vector的区别

时间:2017-09-10 17:41:53      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:pac   city   protect   inter   help   bsp   源码   cto   int   

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

相同处: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的区别

标签:pac   city   protect   inter   help   bsp   源码   cto   int   

原文地址:http://www.cnblogs.com/duxiaoqian/p/7501447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!