ArrayList和LinkedList有何不同?
可以先從底層數(shù)據(jù)結(jié)構(gòu)開始說起,然后以某一個方法為突破口深入,比如:最大的不同是兩者底層的數(shù)據(jù)結(jié)構(gòu)不同,ArrayList底層是數(shù)組,LinkedList底層是雙向鏈表,兩者的數(shù)據(jù)結(jié)構(gòu)不同也導(dǎo)致了操作的API實現(xiàn)有所差異,拿新增實現(xiàn)來說,ArrayList會先計算并決定是否擴容,然后把新增的數(shù)據(jù)直接賦值到數(shù)組上,而LinkedList僅僅只需要改變插入節(jié)點和其前后節(jié)點的指向位置關(guān)系即可。最后說一下特點,ArrayList查詢快,增刪慢LinkedList查詢慢,增刪快。
ArrayList和LinkedList應(yīng)用場景有何不同?
ArrayList更適合于快速的查找匹配,不適合頻繁新增刪除,像工作中經(jīng)常會對元素進行匹配查詢的場景比較合適,LinkedList更適合于經(jīng)常新增和刪除,對查詢反而很少的場景。比如我們后面學(xué)習(xí)的線程池和連接池,內(nèi)部就可以使用LinkedList集合實現(xià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是線程安全的么,為什么?
當(dāng)兩者作為非共享變量時,比如說僅僅是在方法里面的局部變量時,是沒有線程安全問題的,只有當(dāng)兩者是共享變量時,才會有線程安全問題。主要的問題點在于多線程環(huán)境下,所有線程任何時刻都可對數(shù)組和鏈表進行操作,這會導(dǎo)致值被覆蓋,甚至混亂的情況。
如果有線程安全問題,在迭代的過程中,會頻繁報ConcurrentModificationException的錯誤,意思是在我當(dāng)前循環(huán)的過程中,數(shù)組或鏈表的結(jié)構(gòu)被其它線程修改了。
如何解決線程安全問題?