LinkedList和ArrayList的区别
LinkedeList和ArrayList都實(shí)現(xiàn)了List接口,但是它們的工作原理卻不一樣。它們之間最主要的區(qū)別在于ArrayList是可改變大小的數(shù)組,而LinkedList是雙向鏈接串列(doubly LinkedList)。ArrayList更受歡迎,很多場(chǎng)景下ArrayList比LinkedList更為適用。這篇文章中我們將會(huì)看看LinkedeList和ArrayList的不同,而且我們?cè)噲D來(lái)看看什么場(chǎng)景下更適宜使用LinkedList,而不用ArrayList。
LinkedList和ArrayList的區(qū)別
LinkedList和ArrayList的差別主要來(lái)自于Array和LinkedList數(shù)據(jù)結(jié)構(gòu)的不同。如果你很熟悉Array和LinkedList,你很容易得出下面的結(jié)論:
1) 因?yàn)锳rray是基于索引(index)的數(shù)據(jù)結(jié)構(gòu),它使用索引在數(shù)組中搜索和讀取數(shù)據(jù)是很快的。Array獲取數(shù)據(jù)的時(shí)間復(fù)雜度是O(1),但是要?jiǎng)h除數(shù)據(jù)卻是開(kāi)銷(xiāo)很大的,因?yàn)檫@需要重排數(shù)組中的所有數(shù)據(jù)。
2) 相對(duì)于ArrayList,LinkedList插入是更快的。因?yàn)長(zhǎng)inkedList不像ArrayList一樣,不需要改變數(shù)組的大小,也不需要在數(shù)組裝滿(mǎn)的時(shí)候要將所有的數(shù)據(jù)重新裝入一個(gè)新的數(shù)組,這是ArrayList最壞的一種情況,時(shí)間復(fù)雜度是O(n),而LinkedList中插入或刪除的時(shí)間復(fù)雜度僅為O(1)。ArrayList在插入數(shù)據(jù)時(shí)還需要更新索引(除了插入數(shù)組的尾部)。
3) 類(lèi)似于插入數(shù)據(jù),刪除數(shù)據(jù)時(shí),LinkedList也優(yōu)于ArrayList。
4) LinkedList需要更多的內(nèi)存,因?yàn)锳rrayList的每個(gè)索引的位置是實(shí)際的數(shù)據(jù),而LinkedList中的每個(gè)節(jié)點(diǎn)中存儲(chǔ)的是實(shí)際的數(shù)據(jù)和前后節(jié)點(diǎn)的位置。
什么場(chǎng)景下更適宜使用LinkedList,而不用ArrayList
我前面已經(jīng)提到,很多場(chǎng)景下ArrayList更受歡迎,但是還有些情況下LinkedList更為合適。譬如:
1) 你的應(yīng)用不會(huì)隨機(jī)訪問(wèn)數(shù)據(jù)。因?yàn)槿绻阈枰狶inkedList中的第n個(gè)元素的時(shí)候,你需要從第一個(gè)元素順序數(shù)到第n個(gè)數(shù)據(jù),然后讀取數(shù)據(jù)。
2) 你的應(yīng)用更多的插入和刪除元素,更少的讀取數(shù)據(jù)。因?yàn)椴迦牒蛣h除元素不涉及重排數(shù)據(jù),所以它要比ArrayList要快。
以上就是關(guān)于ArrayList和LinkedList的差別。你需要一個(gè)不同步的基于索引的數(shù)據(jù)訪問(wèn)時(shí),請(qǐng)盡量使用ArrayList。ArrayList很快,也很容易使用。但是要記得要給定一個(gè)合適的初始大小,盡可能的減少更改數(shù)組的大小。
原文鏈接:? Javarevisited ?翻譯:? ImportNew.com? -? 唐小娟譯文鏈接:?http://www.importnew.com/6629.html
總結(jié)
以上是生活随笔為你收集整理的LinkedList和ArrayList的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 写给程序员的有效学习方法
- 下一篇: 深入字节码操作:使用ASM和Javass