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