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. 相對于ArrayList舟茶,LinkedList的隨機(jī)訪問集合元素時(shí)性能較差谭期,因?yàn)樾枰陔p向列表中找到要index的位置堵第,再返回;但在插入隧出,刪除操作是更快的踏志。因?yàn)長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)的位置。
使用場景:
(1)如果應(yīng)用程序?qū)?shù)據(jù)有較多的隨機(jī)訪問既忆,ArrayList對象要優(yōu)于LinkedList對象驱负;
( 2 ) 如果應(yīng)用程序有更多的插入或者刪除操作,較少的數(shù)據(jù)讀取患雇,LinkedList對象要優(yōu)于ArrayList對象跃脊;
(3)不過ArrayList的插入,刪除操作也不一定比LinkedList慢苛吱,如果在List靠近末尾的地方插入酪术,那么ArrayList只需要移動(dòng)較少的數(shù)據(jù),而LinkedList則需要一直查找到列表尾部翠储,反而耗費(fèi)較多時(shí)間绘雁,這時(shí)ArrayList就比LinkedList要快。