ArrayList 和 LinkList 的區別--源碼解析

 

基於jdk1.8,從源碼中獲取的總結

  linklist arraylist
源碼展示及說明

public class LinkedList<E> extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable

 

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

刪除掉某個數據對象時,是將該對象置空

 

根據適用場景自行選擇使用,沒有假設只有結論的比較毫無意義

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章