Posted on 2008-02-09 19:23
kooyee 閱讀(303)
評(píng)論(0) 編輯 收藏 所屬分類:
Java
Vector 和 ArrayList的不同
有的時(shí)候 Vector更好一些;有的時(shí)候ArrayList 更好一些;有的時(shí)候你一個(gè)也不想用。但愿,你不是在期望一個(gè)簡(jiǎn)單明了的答案,因?yàn)榇鸢敢蚰阍谟盟麄冏鍪裁炊āO旅媸且紤]的四個(gè)方面:
API
同步-Synchronization
數(shù)據(jù)增長(zhǎng)-Data growth
使用方法-Usage patterns
讓我一個(gè)一個(gè)來解釋吧。
API
在The Java Programming Language (Addison-Wesley, June 2000) 中Ken Arnold, James Gosling, 和 David Holmes 是這樣描述Vector的,它是更ArrayList類似的一個(gè)東西,所以從API的觀點(diǎn)來看,它們倆是很相似的。但是,它們之間還是有些微的差別的。
Synchronization
Vectors是可同步化的,意思就是說,任何操作Vector的內(nèi)容的方法都是線程安全的,相反的,另一方面,ArrayList是不可同步化的,所以也不是線程安全的。如果你知道了這些的話,你就會(huì)發(fā)現(xiàn),Vector的同步會(huì)讓它在性能發(fā)方面有一些小問題。所以,如果你不需要線程安全的話,那么就使用ArrayList吧。為什么要為沒有必要的同步付出代價(jià)呢?
Data growth
實(shí)際上,不管是ArrayList還是Vector,在它們內(nèi)部都是使用一個(gè)Array來保存數(shù)據(jù)的。編程過程中,在使用它們?nèi)魏我粋€(gè)的時(shí)候,你都需要記住這一點(diǎn)。你在往一個(gè)ArrayList或者Vector里插入一個(gè)元素的時(shí)候,如果內(nèi)部數(shù)組空間不夠了,這個(gè)對(duì)象(譯者按:指的是你使用的ArrayList或者Vector)就要擴(kuò)展它的大小。Vector在默認(rèn)情況下是產(chǎn)生一個(gè)雙倍大小,而ArrayList增加50%的大小。只要你合理的使用這些類,你就可以結(jié)束你在增加新的元素的時(shí)候所付出的性能代價(jià)。把對(duì)象(譯者按:指的是你使用的ArrayList或者Vector)的初始化容量指定為你編程過程中所能用到的最大的容量總是最好的辦法。仔細(xì)的指定容量,你可以避免以后改變內(nèi)部Array容量,所要付出的代價(jià)。如果你并不知道到底有多少個(gè)數(shù)據(jù),當(dāng)是你知道數(shù)據(jù)的增長(zhǎng)率,Vector確實(shí)有一點(diǎn)點(diǎn)優(yōu)勢(shì),因?yàn)槟憧梢灾付ㄔ黾又?譯者按,如果沒有猜錯(cuò)的話,作者說的方法應(yīng)該是setSize(int newSize) Sets the size of this vector.)。
Usage patterns
ArrayList和Vector在從指定位置取得元素,從容器的末尾增加和刪除元素都非常的有效,所有的這些操作都能在一個(gè)常數(shù)級(jí)的時(shí)間(O(1))內(nèi)完成。但是從一個(gè)其他的位置增加和刪除一個(gè)元素就顯得頗為費(fèi)時(shí),差不多需要的時(shí)間為O(n-i),這里的n代表元素個(gè)數(shù),i代表要增加和刪除的元素所在的位置。這些操作需花費(fèi)更多的時(shí)間,因?yàn)槟阈枰€(gè)移動(dòng)i和更高位置的元素。那么,以上這些到底說明了什么呢?
這意味著,如果你取得一個(gè)元素,或者從數(shù)組末尾增加或刪除一個(gè)元素的話,隨便你使用Vector和ArrayList。如果你想要對(duì)數(shù)組內(nèi)容做其他操作的話,那么就為自己好另一個(gè)容器吧。比喻說,LinkedList可以在常數(shù)級(jí)時(shí)間(O(1))內(nèi)為任意一個(gè)位置的元素增加和刪除。但是,取得一個(gè)元素,會(huì)稍微慢一點(diǎn),時(shí)間要用O(i) ,這個(gè)i是元素的位置。通過ArrayList也是很簡(jiǎn)單的,因?yàn)槟憧梢院?jiǎn)單使用一個(gè)索引,而不是構(gòu)造一個(gè)iterator 。LinkedList也為每個(gè)插入的元素建立一個(gè)內(nèi)部對(duì)象。所以,你也必須知道,同時(shí)產(chǎn)生了垃圾對(duì)象。
最后,Practical Java (Addison-Wesley, Feb. 2000) Peter Haggar 里的“實(shí)踐41“建議你使用一個(gè)普通的原始的數(shù)組來代替Vector和ArrayListe,特別是對(duì)效率優(yōu)先的代碼來說。通過使用數(shù)組(array),你可以避免同步,額外的方法調(diào)用,非理想化的大小改變。你付出的只是額外的開發(fā)時(shí)間。