ArrayList 介紹
ArrayList是一種線性資料結構,它的底層是用陣列實現的,是動態陣列。與Java中的陣列相比,它的容量能動態增長。原始碼裡有解釋。當建立一個數組的時候,就必須確定它的大小,系統會在記憶體中開闢一塊連續的空間,用來儲存陣列,因此陣列容量固定且無法動態改變。ArrayList在保留陣列可以快速查詢的優勢的基礎上,彌補了陣列在建立後,要往陣列新增元素的弊端。好了不說太多,咱們的目標是原始碼實現。往下看。。。
底層實現:
ArrayList 繼承了AbstractList,實現了List。它是一個數組佇列,提供了相關的新增、刪除、修改、遍歷等功能。
ArrayList 實現了RandmoAccess介面,即提供了隨機訪問功能。RandmoAccess是java中用來被List實現,為List提供快速訪問功能的。在ArrayList中,我們即可以通過元素的序號快速獲取元素物件;這就是快速隨機訪問。稍後,我們會比較List的“快速隨機訪問”和“通過Iterator迭代器訪問”的效率。
ArrayList 實現了Cloneable介面,即覆蓋了函式clone(),能被克隆。
ArrayList 實現java.io.Serializable介面,這意味著ArrayList支援序列化,能通過序列化去傳輸。
直接上原始碼 下圖一步一步解析
我們只需記住該預設容量的大小為 10 即可
上圖是共享的空陣列例項用於預設大小的空例項。我們將其與EMPTY_ELEMENTDATA區分開來,以便知道新增第一個元素時要膨脹多少。
陣列有下標的概念,預設大小是10 的情況下,它的下標就是 0 - 9.
這裡定義的動態就是ArrayList的優勢,所以它才會在有陣列優點的基礎上,又是可變大小。
每新增一個元素,這裡的size 就會++, +1 操作; size 就代表當前的元素數量。
這兩個為一部分 ,沒截圖完整。
minCapacity—期望的最小容量,這裡才發現表示的是期望容量!!!
上述註釋的意思為增加容量,以確保它至少能容納由最小容量引數指定的元素數量。
這個函式就表示了為什麼擴容機制為1.5倍,再接著看
這個函式表示了巨大的容量 傳入了一個你期望的容量,經過判斷 如果容量為 0 就丟擲記憶體異常
接著又是三目運算子,條件為如果期望容量大於Array的最大值 這個表示式為true 就返回Integer 的最大值 否則返回Array長度的最大值。
到現在就解析完成了ArrayList 的底層如何實現 啊 好累啊 如需讓我補充 敬請評論 互相交流學習
之後原始碼的方法 ,也就是封裝的方法,增加刪除等等。
我就不過多介紹了 大家再見!!!