从源码分析ArrayList和Vector区别

来源:互联网 发布:易企cms怎么换模板 编辑:程序博客网 时间:2024/05/17 23:26

最近在看JDK源码,现在从源码角度分析下ArrayList和Vector区别


注:本文源码基于JDK1.6

1.构造器

   先从构造器入手在适合不过

   ArrayList有三个构造器:

  1. public ArrayList(int initialCapacity)//构造一个具有指定初始容量的空列表。  
  2. public ArrayList()//构造一个初始容量为10的空列表。  
  3. public ArrayList(Collection<? extends E> c)//构造一个包含指定 collection 的元素的列表 
   Vector有四个构造方法:

  1. public Vector()//使用指定的初始容量和等于零的容量增量构造一个空向量。  
  2. public Vector(int initialCapacity)//构造一个空向量,使其内部数据数组的大小,其标准容量增量为零。  
  3. public Vector(Collection<? extends E> c)//构造一个包含指定 collection 中的元素的向量  
  4. public Vector(int initialCapacity,int capacityIncrement)//使用指定的初始容量和容量增量构造一个空的向量 
总结:Vector比Arraylist多一个构造方法,没错就是public Vector(int initialCapacity,int capacityIncrement)这个构造方法,         capacityIncrement就是容量增长,即前面所说的增长因子,ArrayList中是没有的

2.Add方法

ArrayList:

public void ensureCapacity(int minCapacity) {
    modCount++;
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        Object oldData[] = elementData;
        int newCapacity = (oldCapacity * 3)/2 + 1;
            if (newCapacity < minCapacity)
        newCapacity = minCapacity;
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
    }
    }


vector:

 private void ensureCapacityHelper(int minCapacity) {
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        Object[] oldData = elementData;
        int newCapacity = (capacityIncrement > 0) ?
        (oldCapacity + capacityIncrement) : (oldCapacity * 2);
            if (newCapacity < minCapacity) {
        newCapacity = minCapacity;
        }
            elementData = Arrays.copyOf(elementData, newCapacity);
    }
    }

总结:ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍


3.线程安全

vector中很多方法都是用关键字synchronized修饰而ArrayList则没有

总结:Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销


4.成员变量

ArrayList:

private transient Object[] elementData;

vector:

protected Object[] elementData;


总结:ArrayList和vector内部都是通过数组实现,但ArrayList是私有的不可序列化


0 0