ArrayList金砍、LinkedList恕稠、Vector的區(qū)別
1谱俭、List概述
List,就如圖名字所示一樣,是元素的有序列表。當(dāng)我們討論List時(shí)术陶,將其與Set作對(duì)比是一個(gè)很好的辦法,Set集合中的元素是無(wú)序且唯一的梧宫。
下圖是Collection的類繼承圖,從圖中你可以對(duì)本文所討論的知識(shí)有大致的了解.
2、ArrayList忌卤、LinkedList與Vector對(duì)比
從上圖可以看出三者都繼承了List接口驰徊。所使用的方法也十分相似棍厂。主要的區(qū)別在于實(shí)現(xiàn)方式的不同牺弹,所以對(duì)于不同的操作有不同的效率张漂。
ArrayList是一個(gè)可變大小的數(shù)組鹃锈,當(dāng)元素?cái)?shù)量達(dá)到數(shù)組容量上限時(shí)屎债,數(shù)組的容量會(huì)動(dòng)態(tài)的增長(zhǎng)盆驹,一般為+50%躯喇。由于ArrayList本質(zhì)上是一個(gè)數(shù)組廉丽,所以內(nèi)部的元素可以get(),set()方法直接訪問(wèn)正压。
LinkedList是一個(gè)雙鏈表焦履,在添加和刪除元素時(shí)擁有比ArrayList更好地性能嘉裤,但是在get() , set()方面弱于ArrayList,當(dāng)然當(dāng)數(shù)據(jù)量非常小時(shí)屑宠,比較便失去了意義。
Vector與arrayList相似妹孙,但其是一個(gè)強(qiáng)同步類,如果你的程序本身是線程安全的或者說(shuō)只有一個(gè)主線程嚣崭,沒(méi)有在多個(gè)線程之間共享一個(gè)對(duì)象雹舀,那么請(qǐng)選擇ArrayList说榆,他不會(huì)讓你失望签财。因?yàn)橛捎谝獙?shí)現(xiàn)強(qiáng)同步唱蒸,必然承擔(dān)效率的損耗神汹。
值得注意的是LinkedList還實(shí)現(xiàn)了Queue接口屁魏,該接口為我們提供了更多的方法蚁堤,包括offer() , poll() 立磁。
3唱歧、ArrayList與LinkList性能比較
測(cè)試代碼git地址:
JavaBase/per.pb.listText/src/text/ArrayListText.java
/*
* 測(cè)試結(jié)論總結(jié):當(dāng)指定下標(biāo)數(shù)據(jù)讀取几于,以及列表末端的插入和刪除ArrayList要優(yōu)于LinkedList
* 當(dāng)非末端的插入和刪除時(shí)沿彭,LinkedList要優(yōu)于ArrayList
*/
使用小技巧:
1喉刘、如果ArrayList的初始容量值特別小睦裳,你可以預(yù)估數(shù)據(jù)量的話廉邑,盡量給ArrayList或者Vector設(shè)置較大的一個(gè)初始容量值蛛蒙。這樣可以減少空間的開(kāi)銷窒典。
2课舍、ArrayList當(dāng)元素?cái)?shù)量超限時(shí)他挎,數(shù)組大小會(huì)增長(zhǎng)50%。Vector則增長(zhǎng)100%筹淫,所以如果對(duì)內(nèi)存要求較高呢撞,可以考慮選擇ArrayList。
3摧阅、一般建議使用ArrayList,線程問(wèn)題可以自定義調(diào)控绷蹲。