Java:Arraylist和Vector的区别

from:http://www.zihou.me/html/2011/01/27/2721.html
谈谈ArrayList和Vector这两种链表,虽然关于这两种链表之间比较的文章或帖子非常多,但我也在这里记录一下。
对于这两种链表,恐怕很多程序员在面试的时候都可能会碰到ArrayList和Vector两者有何区别这样的问题。当然,我想很多程序员通过查找资料也都会了解到这两种类其实非常相似,但在应用场景上又有着本质的不同。
首先,两者的相同性在于:二者都是基于数组的实现,我们可以通过查看两者的源码知道这点:
ArrayList的构造函数及过程:
初始化一个元素数为10的数组
public ArrayList() {

this(10);

}

public ArrayList(int initialCapacity) {

super();

if (initialCapacity < 0)

throw new IllegalArgumentException("Illegal Capacity: "+

initialCapacity);

this.elementData = new Object[initialCapacity];

}
如果初始化值小于0,则会抛出一个异常,否则创建一个10个元素的Object数组。
Vector的构造函数及过程:
public Vector() {

this(10);

}

public Vector(int initialCapacity) {

this(initialCapacity, 0);

}

public Vector(int initialCapacity, int capacityIncrement) {

super();

if (initialCapacity < 0)

throw new IllegalArgumentException("Illegal Capacity: "+

initialCapacity);

this.elementData = new Object[initialCapacity];

this.capacityIncrement = capacityIncrement;

}
从上面可以看出,其实现也是基于数组来进行的。
至于二者的方法,大多都一样,比如得到某一元素的get(i)方法:
return (E) elementData[index];
都是通过数组的查找方式来得到。
但也不是所有的方法功能都是非常类似,比如add(E e)方法,其实现的机制就有很大不同,也就是数组的扩容上,因为当数组满了,而此时又要插入数据很显然就面临数组扩容的问题,而在这方面ArrayList和Vector是有着较大区别的,ArrayList的方法为:
public boolean add(E e) {

ensureCapacity(size + 1);�0�2 // Increments modCount!!

elementData[size++] = e;

return true;

}
其中的ensureCapacity方法为:
public void ensureCapacity(int minCapacity) {

modCount++;

int oldCapacity = elementData.length;

if (minCapacity > oldCapacity) {

Object minCapacity [] = 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);

}

}
上面的做法是先在现有数组大小的基础上加1作为参数minCapacity传入,然后将Object数组的大小赋给一个变量oldCapacity,然后当minCapacity大于oldCapacity时,将现有数组赋给一个minCapacity数组,然后在目前数组大小的基础上乘以1.5再加1得到一个新的容量值,如果当前新的容量值还是小于minCapacity,则将minCapacity作为新的数组容量值,最后生成一个新的容量的数组。
至于Vector的add方法扩容方法,有兴趣的朋友可以自行去查看源码。
参看上面的说明,这两者似乎在应用上没有任何区别,但实际是这样的吗?如果你看到在Vector中有很多的synchronized后,应该能马上明白过来!是的,Vector适用于线程安全的应用场景,而Arraylist是非线程安全的!
两者大概的比较就是上面这些了,最后要说的是,两者由于都是基于数组实现,故大小也就是容量无限制,另外,在删除元素后,数组大小不会减小,要缩小数组容量,可以调用其trimToSize方法。

你可能感兴趣的:(ArrayList)