簡介:arraylist和linkedlist都是list介面的實現類。允許出現重複的元素,元素有序,即存入順序和取出順序一致。
1、執行緒安全性:arraylist和linkedlist都是不同步的,不保證執行緒安全
2、底層資料結構:
(1)arraylist集合底層採用的是object陣列結構。
(2)linkedlist底層採用的是雙向鍊錶結構(jdk7之前為迴圈鍊錶,jdk7取消了迴圈)。
3、插入和刪除:
(1)如果容量為 n 的arraylist在陣列中的指定位置 i 插入乙個元素,則原陣列的i元素以及(n-i)個元素都需要進行移位。所以時間複雜度是o(n-i)。元素越多,增刪速度越慢。
(2)linkedlist因為是雙鏈表結構,插入和刪除只需要更改元素之間的引用關係即可,增刪的速度跟元素的多少無關。時間複雜度近似o(1)。
4、查詢:arraylist支援高效快速隨機訪問,通過元素序號快速查詢獲取元素。而linkedlist不支援快速訪問,即查詢慢。
5、記憶體空間占用:arraylist的空間浪費主要是因為需要在列表的結尾預留一定的容量空間,而linkedlist的空間花費主要體現在每個元素的儲存需要更大的空間(要存放每個元素的前驅引用和後繼引用)。
randomaccess介面:randomaccess 介面中好像並沒有定義什麼,只是乙個標識,標識實現這個介面的類具有隨機訪問功能。 如arraylist就實現了randomaccess 介面。
遍歷方式選擇:
(1)實現了randomaccess 介面,優先選擇for迴圈遍歷,其次是foreach。
(2)未實現randomaccess 介面,優先選擇迭代器iterator遍歷(foreach底層也是通過iterator實現的)。大size資料千萬千萬不能使用for迴圈遍歷。
原因:
linkedlist中的get()的原始碼
如果用for迴圈遍歷linkedlist,在get第i個元素需要先到get第(i-1)個元素,等於在拿任意乙個位置的元素都需要把前面的資料走一遍。等於for迴圈內巢狀了乙個for迴圈,資料非常大時,時間複雜度近似於o(n*n)。而時間的複雜度大小順序為o(1) < o(logn) < o(n) < o(nlogn) < o(n^2) < o(n^3) < o(2^n)。因此切忌不能用for迴圈來比遍歷linkedlist陣列。
arraylist中的get()的原始碼
arraylist是直接從陣列中里拿乙個位置上的元素,時間複雜度是o(1),是非常快的。
Array List和ArrayList的區別與
定義 public abstract class array icloneable,ilist,icollection,ienumerable,istructuralcomparable,istructuraequatable 陣列在記憶體中是連續儲存的,所以它的索引速度是非常的快,而且賦值與修改元...
LinkedList和ArrayList的區別
對於集合collection下的list介面,有兩個實現類,arraylist和linkedlist,那麼他們兩個有什麼區別呢。arraylist的底層由陣列實現,而linkedlist的底層由雙向鍊錶實現,底層的不同才是他們區別的根源。然而因為他們繼承於同乙個父介面,他們的很多方法都是相同的。關於...
ArrayList和LinkedList的面試題
一 arraylist為什麼是執行緒不安全的?arraylist在新增乙個元素的時候,它可能會有兩步來完成 1.在 items size 的位置存放此元素 2.增大 size 的值。在單執行緒執行的情況下,如果 size 0,新增乙個元素後,此元素在位置 0,而且 size 1 而如果是在多執行緒情...