最近在看JDK源码,现在从源码角度分析下ArrayList和Vector区别
注:本文源码基于JDK1.6
1.构造器
先从构造器入手在适合不过
ArrayList有三个构造器:
- public ArrayList(int initialCapacity)//构造一个具有指定初始容量的空列表。
- public ArrayList()//构造一个初始容量为10的空列表。
- public ArrayList(Collection<? extends E> c)//构造一个包含指定 collection 的元素的列表
- public Vector()//使用指定的初始容量和等于零的容量增量构造一个空向量。
- public Vector(int initialCapacity)//构造一个空向量,使其内部数据数组的大小,其标准容量增量为零。
- public Vector(Collection<? extends E> c)//构造一个包含指定 collection 中的元素的向量
- 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是私有的不可序列化