http://blog.csdn.net/wangzff/article/details/7296648
ArrayList,LinkedList是不同步的,而Vestor是同步的
eg:Vestor中添加對象的方法public synchronized boolean add(E o)是加了synchronized 的。
ArrayList,Vestor的特點(diǎn)
內(nèi)部實現(xiàn)機(jī)制來講ArrayList和Vector都是使用Objec的數(shù)組形式來存儲的。
增加元素的時候,如果元素的數(shù)目超出了內(nèi)部數(shù)組目前的長度它們都需要擴(kuò)展內(nèi)部數(shù)組的長度,
Vector缺省情況下自動增長原來一倍的數(shù)組長度,ArrayList是原來的50%,
但是Vector可以使用下面的方法進(jìn)行設(shè)置。
public vector(int initialcapacity,int capacityIncrement)
initialcapacity:初始化容量,capacityIncrement擴(kuò)展倍數(shù)。
ArrayList,LinkedList的特點(diǎn)
一般大家都知道ArrayList和LinkedList的大致區(qū)別:
1.ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。
2.對于隨機(jī)訪問get和set,ArrayList覺得優(yōu)于LinkedList,因為LinkedList要移動指針。
3.對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因為ArrayList要移動數(shù)據(jù)。
ArrayList,LinkedList的消耗1
1.對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。
對 ArrayList而言,主要是在內(nèi)部數(shù)組中增加一項,指向所添加的元素,偶爾可能會導(dǎo)致對數(shù)組重新進(jìn)行分配
;而對LinkedList而言,這個開銷是 統(tǒng)一的,分配一個內(nèi)部Entry對象。
2.在ArrayList的 中間插入或刪除一個元素意味著這個列表中剩余的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。
3.LinkedList不 支持高效的隨機(jī)元素訪問。
4.ArrayList的空 間浪費(fèi)主要體現(xiàn)在在list列表的結(jié)尾預(yù)留一定的容量空間,而LinkedList的空間花費(fèi)則體現(xiàn)在它的每一個元素都需要消耗相當(dāng)?shù)目臻g
ArrayList,LinkedList的消耗2
ArrayList和Vector中,從指定的位置(用index)檢索一個對象,或在集合的末尾插入、刪除一個對象的時間是一樣的,可表示為O(1)。但是,如果在集合的其他位置增加或移除元素那么花費(fèi)的時間會呈線形增長:O(n-i),其中n代表集合中元素的個數(shù),i代表元素增加或移除元素的索引位置。為什么會這樣呢?以為在進(jìn)行上述操作的時候集合中第i和第i個元素之后的所有元素都要執(zhí)行(n-i)個對象的位移操作。
LinkedList中,在插入、刪除集合中任何位置的元素所花費(fèi)的時間都是一樣的—O(1),但它在索引一個元素的時候比較慢,為O(i),其中i是索引的位置。
結(jié)論:所以,如果只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用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()));
}
}