1. 程式人生 > >Java面試之ArrayList與LinkedList的比較

Java面試之ArrayList與LinkedList的比較

介紹

ArrayList和LinkedList的使用方法很像,因為他們都實現了List介面,List介面抽象了對集合常見的操作,比如增刪查詢。但是他們在底層實現上卻不一樣,所以在使用的時候也有一些點是特別需要注意的。所以我們先簡單看看他們的實現。

  • 資料結構

ArrayList底層採用Object陣列儲存

 

因為ArrayList的底層是使用陣列儲存,所以這個陣列的一旦例項化,其大小是不變的,但是ArrayList隨著元素新增可以動態變化大小的,於是就無法避免陣列的拷貝動作了,我們看看陣列的新增方法。

如果有正在學java的程式設計師,可來我們的java技術學習扣qun哦:72340,3928,小編花了近一個月整理了一份非常適合18年學習的java乾貨,加入就免費送java的視訊教程噢!而且我每天晚上都會在裡面直播講Java知識,從零基礎學習到有基礎進階,歡迎初學和進階中的小夥伴。

首先ArrayList方法會先呼叫ensureCapacityInternal去確認當前陣列容量能否容納新的元素,如果不能則會使用grow方法進行擴容,可以看到這裡(下圖)是先將陣列大小擴充套件為原來的1.5倍,然後使用Arrays.copy 方法將原來的陣列拷貝到新的數組裡。

 

LinkedList底層採用雙向列表實現

 

所以在新增新元素的時候要先構造一個Node物件(item為我們加入的值),只需要將Node的next賦值為新的Node即可。

 

所以相對於ArrayList而言,LinkedList可以更加高效的插入元素,因為它不會涉及到ArrayList擴容。但也因為這種資料結構,導致它不具備有隨機訪問的能力。

總結

1.ArrayList 的插入,刪除效率低於LinkedList。

因為ArrayList需要隨時進行Object陣列容量大小檢查,如果陣列容量不能滿足新插入元素所需要的大小需求,那麼就會觸發自動擴容,將大小擴充套件為原來的1.5倍,在將原來的陣列拷貝到新的陣列中,然後在新增元素,刪除元素時也可能會涉及到陣列拷貝。而LinkedList在新增元素時僅需要將Node的next指向要新增的元素構造出來的Node即可,刪除元素也只涉及到Node指向的改變。

2.ArrayList的可以隨機訪問指get,set方),但是LinkedList不可以。所以ArrayList的隨機訪問效率高。

ArrayList底層是陣列實現,所以它可以通過陣列下標進行訪問,只要知道了陣列下標就可以立即返回結果。但是LinkedList是連結串列實現,給定一個索引值就只能通過遍歷連結串列查詢元素了。所以在遍歷集合時,我們要避免通過隨機查詢元素的方式來遍歷LinkedList。

3.ArrayList和LinkedList都不是執行緒安全的。

ArrayList和LinkedList 內部都維護了modCount(修改次數),也沒有做同步操作,當多個執行緒同時修改時會比較modCount,當modCount不同時丟擲ConcurrentModificationException。