一、ArrayList
ArrayList是一個(gè)可以處理變長(zhǎng)數(shù)組的類型界斜,這里不局限于“數(shù)”組仿耽,ArrayList是一個(gè)泛型類,可以存放任意類型的對(duì)象各薇。顧名思義项贺,ArrayList是一個(gè)數(shù)組列表,因此其內(nèi)部是使用一個(gè)數(shù)組來(lái)存放對(duì)象的峭判,因?yàn)镺bject是一切類型的父類开缎,因而ArrayList內(nèi)部是有一個(gè)Object類型的數(shù)組類存放對(duì)象。ArrayList類常用的方法有add()林螃、clear()奕删、get()、indexOf()疗认、remove()完残、sort()、toArray()横漏、toString()等等谨设,同時(shí)ArrayList內(nèi)部有一個(gè)私有類實(shí)現(xiàn)Iterator接口,因此可以使用iterator()方法得到ArrayList的迭代器绊茧,同時(shí)铝宵,還有一個(gè)私有類實(shí)現(xiàn)了ListIterator接口,因此ArrayList也可以調(diào)用listIterator()方法得到ListIterator迭代器。
由于ArrayList是依靠數(shù)組來(lái)存放對(duì)象的鹏秋,只不過(guò)封裝起來(lái)了而已尊蚁,因此其一些查找方法的效率都是O(n),跟普通的數(shù)組效率差不多侣夷,只不過(guò)這個(gè)ArrayList是一個(gè)可變”數(shù)組“横朋,并且可以存放一切指定的對(duì)象。
另外百拓,由于ArrayList的所有方法都是默認(rèn)在單一線程下進(jìn)行的琴锭,因此ArrayList不具有線程安全性。若想在多線程下使用衙传,應(yīng)該使用Colletions類中的靜態(tài)方法synchronizedList()對(duì)ArrayList進(jìn)行調(diào)用即可决帖。
二、LinkedList
LinkedList可以看做為一個(gè)雙向鏈表蓖捶,所有的操作都可以認(rèn)為是一個(gè)雙向鏈表的操作地回,因?yàn)樗鼘?shí)現(xiàn)了Deque接口和List接口。同樣俊鱼,LinkedList也是線程不安全的刻像,如果在并發(fā)環(huán)境下使用它,同樣用Colletions類中的靜態(tài)方法synchronizedList()對(duì)LinkedList進(jìn)行調(diào)用即可并闲。
在LinkedList的內(nèi)部實(shí)現(xiàn)中细睡,并不是用普通的數(shù)組來(lái)存放數(shù)據(jù)的,而是使用結(jié)點(diǎn)<Node>來(lái)存放數(shù)據(jù)的帝火,有一個(gè)指向鏈表頭的結(jié)點(diǎn)first和一個(gè)指向鏈表尾的結(jié)點(diǎn)last溜徙。不同于ArrayList只能在數(shù)組末尾添加數(shù)據(jù),LinkList可以很方便在鏈表頭或者鏈表尾插入數(shù)據(jù)犀填,或者在指定結(jié)點(diǎn)前后插入數(shù)據(jù)萌京,還提供了取走鏈表頭或鏈表尾的結(jié)點(diǎn),或取走中間某個(gè)結(jié)點(diǎn)宏浩,還可以查詢某個(gè)結(jié)點(diǎn)是否存在知残。add()方法默認(rèn)在鏈表尾部插入數(shù)據(jù)”茸總之求妹,LinkedList提供了大量方便的操作方法,并且它的插入或增加等方法的效率明顯高于ArrayList類型佳窑,但是查詢的效率要低一點(diǎn)制恍,因?yàn)樗且粋€(gè)雙向鏈表。
因此神凑,LinkedList與ArrayList最大的區(qū)別是LinkedList更加靈活净神,并且部分方法的效率比ArrayList對(duì)應(yīng)方法的效率要高很多何吝,對(duì)于數(shù)據(jù)頻繁出入的情況下,并且要求操作要足夠靈活鹃唯,建議使用LinkedList爱榕;對(duì)于數(shù)組變動(dòng)不大,主要是用來(lái)查詢的情況下坡慌,可以使用ArrayList黔酥。
三、Vector
Vector也是一個(gè)類似于ArrayList的可變長(zhǎng)度的數(shù)組類型洪橘,它的內(nèi)部也是使用數(shù)組來(lái)存放數(shù)據(jù)對(duì)象的跪者。值得注意的是Vector與ArrayList唯一的區(qū)別是,Vector是線程安全的熄求,即它的大部分方法都包含有關(guān)鍵字synchronized渣玲,因此,若對(duì)于單一線程的應(yīng)用來(lái)說(shuō)弟晚,最好使用ArrayList代替Vector柜蜈,因?yàn)檫@樣效率會(huì)快很多(類似的情況有StringBuffer與StringBuilder);而在多線程程序中指巡,為了保證數(shù)據(jù)的同步和一致性,可以使用Vector代替ArrayList實(shí)現(xiàn)同樣的功能隶垮。