基於jdk1.8,從源碼中獲取的總結
linklist | arraylist | |
源碼展示及說明 |
public class LinkedList<E> extends AbstractSequentialList<E>
Deque: 支持兩端元素插入和移除的線性集合 AbstractSequentialList: 繼承了AbstractList類,其方法是用ListIterator和Iterator(迭代器)實現對元素的增刪改管理。 |
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
RandomAccess接口: List實現使用,支持快速隨機訪問 |
實現 |
對象node實現,包含:前一個元素,元素本身,下一個元素。 transient :字段的生命週期僅存於調用者的內存中 |
數組對象實現(查詢快,增刪慢)。 |
擴容 | 一個一個相加 |
源碼:oldCapacity + (oldCapacity >> 1), 1,默認大小爲10,然後1.5倍左右擴容, 2,設定爲0的時候,前四次每次加1,第五次開始1.5倍擴容 3,最大長度爲Integer 的最大值減 8。 |
實際容量 | 數量取自內存中對象的 size屬性的變動 | 數量取自數組的動態大小變動 |
增刪 |
增刪操作後,重新制定當前元素的前一個對象,後一個對象,更新size,first,last對應的node數據。 尾部增加和刪除 O(1)複雜度 指定位置增加 O(n)複雜度 |
增刪操作後,要先計算容量,容量不足或者容量過大,需要重新調整容量大小,然後將數據複製到新的內存,並將新的元素加到舊數組後面。 尾部增加 O(1)複雜度 指定位置增加和刪除O(n)複雜度 |
查詢 |
依賴node對象的pre和next屬性,一個一個查找。下標小於長度的一半,就從前往後找,反之,從後往前找。 O(n)複雜度 |
根據數組下標,一個一個查找。O(1)複雜度 |
有趣點 |
transient :字段的生命週期僅存於調用者的內存中 全局屬性:size(大小),first(第一個元素),last(最後更新的元素) 三個變量隨着增刪動態變換,非真實數據存儲位置,滿足類需要 |
transient :字段的生命週期僅存於調用者的內存中 全局屬性:elementData 數組變量隨着增刪動態變換,即真實數據存儲位置 |
優勢 | 適合增刪 | 適合查詢 |
linklist中有意思的事情
每個元素對象包括三個屬性:prev(前一個對象),item(當前對象),next(下一個對象)。以: prev & item & next
一個值時:null & v1 & null
兩個值時:null & v1& v2 v1 & v2 & null
三個值時:null & v1 & v2 v1 & v2 & v3 v2 & v3 & null
中間新增value4時:null & v1& v2 v1 & v2 & v4 v2 & v4 & v3 v4 & v3 & null
尾部新增value4時:null & v1& v2 v1 & v2 & v3 v2 & v3 & v4 v3 & v4 & null
尾部刪除value4時:null & v1& v2 v1 & v2 & v3 v2 & v3 & null null & null & null
中間刪除value3時:null & v1& v2 v1 & v2 & v4 null & null & null v2 & v4 & null
刪除掉某個數據對象時,是將該對象置空
根據適用場景自行選擇使用,沒有假設只有結論的比較毫無意義