http://blog.csdn.net/wangzff/article/details/7296648
ArrayList,LinkedList是不同步的,而Vestor是同步的
eg:Vestor中添加对象的方法public synchronized boolean add(E o)是加了synchronized 的。
ArrayList,Vestor的特点
内部实现机制来讲ArrayList和Vector都是使用Objec的数组形式来存储的。
增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,
Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,
但是Vector可以使用下面的方法进行设置。
public vector(int initialcapacity,int capacityIncrement)
initialcapacity:初始化容量,capacityIncrement扩展倍数。
ArrayList,LinkedList的特点
一般大家都知道ArrayList和LinkedList的大致区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
ArrayList,LinkedList的消耗1
1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。
对 ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配
;而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。
2.在ArrayList的 中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3.LinkedList不 支持高效的随机元素访问。
4.ArrayList的空 间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
ArrayList,LinkedList的消耗2
ArrayList和Vector中,从指定的位置(用index)检索一个对象,或在集合的末尾插入、删除一个对象的时间是一样的,可表示为O(1)。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行(n-i)个对象的位移操作。
LinkedList中,在插入、删除集合中任何位置的元素所花费的时间都是一样的—O(1),但它在索引一个元素的时候比较慢,为O(i),其中i是索引的位置。
结论:所以,如果只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。
如果是对其它指定位置的插入、删除操作,最好选择LinkedList
测试添加的时候ArrayList,LinkedList的消耗
public class TestList {
static final int N=5000;
@SuppressWarnings({ "unchecked", "rawtypes" })
static long timeList(List list){
long start=System.currentTimeMillis();
Object o = new Object();
for(int i=0;i<N;i++)
list.add(0, o);
return System.currentTimeMillis()-start;
}
@SuppressWarnings("rawtypes")
public static void main(String[] args) {
System.out.println("ArrayList耗时:"+timeList(new ArrayList()));
System.out.println("LinkedList耗时:"+timeList(new LinkedList()));
}
}