1. 程式人生 > >ArrayList和LinkedList集合有什麼區別?

ArrayList和LinkedList集合有什麼區別?

看到這個問題大家都覺得很簡單是嗎?

ArrayList查詢快!LinkedList增刪快!很簡單的問題不是嗎?

這樣回答的話當然是對的,但是還不夠!

有的人可能會說ArrayList底層是一個數組,所以查詢快,LinkedList底層是一個連結串列,所以增刪快.

這樣回答的話當然比第一個更好,但是還是不夠!

那麼到底怎麼回答才全面呢?直接上圖!

陣列


連結串列


那麼為什麼陣列查詢就快了呢?因為假設數組裡面儲存的是一組物件,每個物件都有記憶體大小,例如物件中有一個欄位是int型別佔用4個位元組(只考慮實際資料佔用的記憶體),陣列在堆上的記憶體在陣列被創建出來就被確定了是40個位元組.如果我們要查詢第9個物件,可以通過(9-1)*4=32,從33到36位元組就是我們要找的物件.是不是很快呢?而連結串列卻不能做到這樣的效率.如上圖,我們要找到A4,必須先找到A3,再先找到A2,再先找到A1.這樣的查詢效率會大大降低.

好了,說了查詢,再說說插入,陣列的插入也相當的浪費效率,如果要在陣列內的某一個位置進行插入,需要先將插入位置的前面複製一份,然後在新的陣列後面新增新的元素,最後將舊的陣列後半部分新增的新的陣列後面,而在連結串列中插入就變得相當簡單了,比如我要在A3和A4中插入B,只需定位到A3的指標和A4的資料即可,將A3的指標指向B的值,將B的指標指向A4的值,B就插入進了連結串列.

說了那麼多,怎麼能不來點實際的呢?那麼我們就來測一測吧!

ArrayList和LinkedList插入操作測試

測試程式碼:


測試結果:經過幾次反覆執行,時間差大概是2ms


ArrayList和LinkedList查詢操作測試




測試結果:很不穩定,但是多測幾次大概是在2ms左右

總結一下:這個資料量算小的了,所有效果不是很明顯,(提一下ArrayList底層陣列貌似有一個擴容效率的問題喲!感興趣的小夥伴可以查一查,很有用的),就是說面試的時候,大家回答的都是不同連結串列的特點,有時候面試官比較刁鑽,刨根問底!這個答案介意借鑑一下!測試有什麼不對的地方希望大家指出.互相學習喲~