ArrayList和LinkedList有何不同?
可以先從底層數(shù)據(jù)結(jié)構(gòu)開始說(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兩者有沒有最大容量?
ArrayList有最大容量的,為Integer的最大值,大于這個(gè)值JVM是不會(huì)為數(shù)組分配內(nèi)存空間的,LinkedList底層是雙向鏈表,理論上可以無(wú)限大。但源碼中,LinkedList實(shí)際大小用的是int類型,這也說(shuō)明了LinkedList不能超過Integer的最大值,不然會(huì)溢出。
ArrayList和LinkedList是如何對(duì)null值進(jìn)行處理的?
ArrayList允許null值新增,也允許null值刪除。刪除null值時(shí),是從頭開始,找到第一值是null的元素刪除;LinkedList新增刪除時(shí)對(duì)null值沒有特殊校驗(yàn),是允許新增和刪除的。
ArrayList和LinedList是線程安全的么,為什么?
當(dāng)兩者作為非共享變量時(shí),比如說(shuō)僅僅是在方法里面的局部變量時(shí),是沒有線程安全問題的,只有當(dāng)兩者是共享變量時(shí),才會(huì)有線程安全問題。主要的問題點(diǎn)在于多線程環(huán)境下,所有線程任何時(shí)刻都可對(duì)數(shù)組和鏈表進(jìn)行操作,這會(huì)導(dǎo)致值被覆蓋,甚至混亂的情況。
如果有線程安全問題,在迭代的過程中,會(huì)頻繁報(bào)ConcurrentModificationException的錯(cuò)誤,意思是在我當(dāng)前循環(huán)的過程中,數(shù)組或鏈表的結(jié)構(gòu)被其它線程修改了。
如何解決線程安全問題?