教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

ArrayList和LinkedList的區(qū)別和聯(lián)系匯總

更新時(shí)間:2020年10月13日15時(shí)58分 來(lái)源:傳智播客 瀏覽次數(shù):

ArrayList和LinkedList有何不同?

可以先從底層數(shù)據(jù)結(jié)構(gòu)開(kāi)始說(shuō)起,然后以某一個(gè)方法為突破口深入,比如:最大的不同是兩者底層的數(shù)據(jù)結(jié)構(gòu)不同,ArrayList底層是數(shù)組,LinkedList底層是雙向鏈表,兩者的數(shù)據(jù)結(jié)構(gòu)不同也導(dǎo)致了操作的API實(shí)現(xiàn)有所差異,拿新增實(shí)現(xiàn)來(lái)說(shuō),ArrayList會(huì)先計(jì)算并決定是否擴(kuò)容,然后把新增的數(shù)據(jù)直接賦值到數(shù)組上,而LinkedList僅僅只需要改變插入節(jié)點(diǎn)和其前后節(jié)點(diǎn)的指向位置關(guān)系即可。最后說(shuō)一下特點(diǎn),ArrayList查詢快,增刪慢LinkedList查詢慢,增刪快。

ArrayList和LinkedList應(yīng)用場(chǎng)景有何不同?

ArrayList更適合于快速的查找匹配,不適合頻繁新增刪除,像工作中經(jīng)常會(huì)對(duì)元素進(jìn)行匹配查詢的場(chǎng)景比較合適,LinkedList更適合于經(jīng)常新增和刪除,對(duì)查詢反而很少的場(chǎng)景。比如我們后面學(xué)習(xí)的線程池和連接池,內(nèi)部就可以使用LinkedList集合實(shí)現(xiàn)。

ArrayList和LinkedList的區(qū)別和聯(lián)系

ArrayList和LinkedList兩者有沒(méi)有最大容量?

ArrayList有最大容量的,為Integer的最大值,大于這個(gè)值JVM是不會(huì)為數(shù)組分配內(nèi)存空間的,LinkedList底層是雙向鏈表,理論上可以無(wú)限大。但源碼中,LinkedList實(shí)際大小用的是int類型,這也說(shuō)明了LinkedList不能超過(guò)Integer的最大值,不然會(huì)溢出。

ArrayList和LinkedList是如何對(duì)null值進(jìn)行處理的?

ArrayList允許null值新增,也允許null值刪除。刪除null值時(shí),是從頭開(kāi)始,找到第一值是null的元素刪除;LinkedList新增刪除時(shí)對(duì)null值沒(méi)有特殊校驗(yàn),是允許新增和刪除的。

ArrayList和LinedList是線程安全的么,為什么?

當(dāng)兩者作為非共享變量時(shí),比如說(shuō)僅僅是在方法里面的局部變量時(shí),是沒(méi)有線程安全問(wèn)題的,只有當(dāng)兩者是共享變量時(shí),才會(huì)有線程安全問(wèn)題。主要的問(wèn)題點(diǎn)在于多線程環(huán)境下,所有線程任何時(shí)刻都可對(duì)數(shù)組和鏈表進(jìn)行操作,這會(huì)導(dǎo)致值被覆蓋,甚至混亂的情況。
如果有線程安全問(wèn)題,在迭代的過(guò)程中,會(huì)頻繁報(bào)ConcurrentModificationException的錯(cuò)誤,意思是在我當(dāng)前循環(huán)的過(guò)程中,數(shù)組或鏈表的結(jié)構(gòu)被其它線程修改了。

如何解決線程安全問(wèn)題?

Java源碼中推薦使用Collections#synchronizedList進(jìn)行解決,Collections#synchronizedList的返回值是List的每個(gè)方法都加了synchronized鎖,保證了在同一時(shí)刻,數(shù)組和鏈表只會(huì)被一個(gè)線程所修改,或者采用CopyOnWriteArrayList并發(fā)List來(lái)解決,這個(gè)類我們后面會(huì)說(shuō)。


猜你喜歡:

Java arraylist使用教程

ArrayList入門教程

ArrayList集合源碼分析

黑馬程序員Java培訓(xùn)課程 


0 分享到:
和我們?cè)诰€交談!