1、list
list—是乙個有序的集合,可以包含重複的元素,提供了按索引訪問的方式,它繼承collection。
list有兩個重要的實現類:arraylist和linkedlist。
list是乙個介面,繼承了collection介面,因此包含了collection介面的所有方法。
2、arraylist
arraylist是乙個可以處理變長陣列的型別,這裡不侷限於「數」組,arraylist是乙個泛型類,可以存放任意型別的物件。顧名思義,arraylist是乙個陣列列表,因此其內部是使用乙個陣列來存放物件的,因為object是一切型別的父類,因而arraylist內部是有乙個object型別的陣列類存放物件。
由於arraylist是依靠陣列來存放物件的,只不過封裝起來了而已,因此其一些查詢方法的效率都是o(n),跟普通的陣列效率差不多,只不過這個arraylist是乙個可變」陣列「,並且可以存放一切指定的物件。
另外,由於arraylist的所有方法都是預設在單一執行緒下進行的,因此arraylist不具有執行緒安全性。若想在多執行緒下使用,應該使用colletions類中的靜態方法synchronizedlist()對arraylist進行呼叫即可。
3、linkedlist
linkedlist可以看做為乙個雙向鍊錶,所有的操作都可以認為是乙個雙向鍊錶的操作,因為它實現了deque介面和list介面。同樣,linkedlist也是執行緒不安全的,如果在併發環境下使用它,同樣用colletions類中的靜態方法synchronizedlist()對linkedlist進行呼叫即可。
在linkedlist的內部實現中,並不是用普通的陣列來存放資料的,而是使用結點來存放資料的,有乙個指向煉表頭的結點first和乙個指向鍊錶尾的結點last。不同於arraylist只能在陣列末尾新增資料,linklist可以很方便在煉表頭或者鍊錶尾插入資料,或者在指定結點前後插入資料,還提供了取走煉表頭或鍊錶尾的結點,或取走中間某個結點,還可以查詢某個結點是否存在。add()方法預設在鍊錶尾部插入資料。總之,linkedlist提供了大量方便的操作方法,並且它的插入或增加等方法的效率明顯高於arraylist型別,但是查詢的效率要低一點,因為它是乙個雙向鍊錶。
因此,linkedlist與arraylist最大的區別是linkedlist更加靈活,並且部分方法的效率比arraylist對應方法的效率要高很多,對於資料頻繁出入的情況下,並且要求操作要足夠靈活,建議使用linkedlist;對於陣列變動不大,主要是用來查詢的情況下,可以使用arraylist。
4、對比
時間複雜度|操作
陣列鍊錶
隨機訪問
o(1)
o(n)
頭部插入
o(n)
o(1)
頭部刪除
o(n)
o(1)
尾部插入
o(1)
o(1)
尾部刪除
o(1)
o(1)
小結同樣查詢, 時間複雜度都是o(n), 但是陣列要比鍊錶快
因為陣列的連續記憶體, 會有一部分或者全部資料一起進入到cpu快取, 而鍊錶還需要在去記憶體中根據上下游標查詢, cpu快取比記憶體塊太多
資料大小固定, 不適合動態儲存, 動態新增, 記憶體為一連續的位址, 可隨機訪問, 查詢速度快
鍊錶代銷可變, 擴充套件性強, 只能順著指標的方向查詢, 速度較慢
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 而如果是在多執行緒情...