ArrayList與LinkedList的區(qū)別和使用場(chǎng)景

1. LinkedList和ArrayList的差別主要來自于Array和LinkedList數(shù)據(jù)結(jié)構(gòu)的不同。ArrayList是基于數(shù)組實(shí)現(xiàn)的,LinkedList是基于雙鏈表實(shí)現(xiàn)的。另外LinkedList類不僅是List接口的實(shí)現(xiàn)類,可以根據(jù)索引來隨機(jī)訪問集合中的元素,除此之外,LinkedList還實(shí)現(xiàn)了Deque接口,Deque接口是Queue接口的子接口,它代表一個(gè)雙向隊(duì)列,因此LinkedList可以作為雙向?qū)α校瑮#梢詤⒁奃eque提供的接口方法)和List集合使用,功能強(qiáng)大。

2. 因?yàn)锳rray是基于索引(index)的數(shù)據(jù)結(jié)構(gòu),它使用索引在數(shù)組中搜索和讀取數(shù)據(jù)是很快的,可以直接返回?cái)?shù)組中index位置的元素,因此在隨機(jī)訪問集合元素上有較好的性能。Array獲取數(shù)據(jù)的時(shí)間復(fù)雜度是O(1),但是要插入、刪除數(shù)據(jù)卻是開銷很大的,因?yàn)檫@需要移動(dòng)數(shù)組中插入位置之后的的所有元素。

3. 相對(duì)于ArrayList,LinkedList的隨機(jī)訪問集合元素時(shí)性能較差,因?yàn)樾枰陔p向列表中找到要index的位置,再返回;但在插入,刪除操作是更快的。因?yàn)長(zhǎng)inkedList不像ArrayList一樣,不需要改變數(shù)組的大小,也不需要在數(shù)組裝滿的時(shí)候要將所有的數(shù)據(jù)重新裝入一個(gè)新的數(shù)組,這是ArrayList最壞的一種情況,時(shí)間復(fù)雜度是O(n),而LinkedList中插入或刪除的時(shí)間復(fù)雜度僅為O(1)。ArrayList在插入數(shù)據(jù)時(shí)還需要更新索引(除了插入數(shù)組的尾部)。

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)景:

(1)如果應(yīng)用程序?qū)?shù)據(jù)有較多的隨機(jī)訪問,ArrayList對(duì)象要優(yōu)于LinkedList對(duì)象;

( 2 ) 如果應(yīng)用程序有更多的插入或者刪除操作,較少的數(shù)據(jù)讀取,LinkedList對(duì)象要優(yōu)于ArrayList對(duì)象;

(3)不過ArrayList的插入,刪除操作也不一定比LinkedList慢,如果在List靠近末尾的地方插入,那么ArrayList只需要移動(dòng)較少的數(shù)據(jù),而LinkedList則需要一直查找到列表尾部,反而耗費(fèi)較多時(shí)間,這時(shí)ArrayList就比LinkedList要快。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容