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

全國咨詢/投訴熱線:400-618-4000

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

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

ArrayList和LinkedList有何不同?

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

ArrayList和LinkedList應用場景有何不同?

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

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

ArrayList和LinkedList兩者有沒有最大容量?

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

ArrayList和LinkedList是如何對null值進行處理的?

ArrayList允許null值新增,也允許null值刪除。刪除null值時,是從頭開始,找到第一值是null的元素刪除;LinkedList新增刪除時對null值沒有特殊校驗,是允許新增和刪除的。

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

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

如何解決線程安全問題?

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


猜你喜歡:

Java arraylist使用教程

ArrayList入門教程

ArrayList集合源碼分析

黑馬程序員Java培訓課程 


0 分享到:
和我們在線交談!