1.ArrayList結構如何
ArrayList是最常用於存儲元素的 Java 類。那麼如何ArrayList工作以及為什麼每個人都如此喜歡它?
結構ArrayList簡單巧妙。每個ArrayList對象包含兩個字段:
- 元素數組
- 一個
size變量,它存儲列表中元素的數量
在內部,一個ArrayList對象包含一個最普通的數組!但這還不是全部。還有一個大小變量,它存儲列表的長度。它是這樣工作的:
最初,列表中數組的長度為 10。變量size為 0。
如果向列表中添加一個元素,它將存儲在數組的第 0 個單元格中,並將size增加到 1。
如果再添加一個元素,它將存儲在第一個單元格中,並size再次增加 1 並等於 2。
如果在數組中沒有更多空間時添加另一個元素,則方法中會發生以下情況add():
- 創建一個新數組,其長度是前一個數組長度的一倍半
- 舊數組的所有元素都被複製到新數組中。
- 在該
ArrayList對像中,對新數組的引用替換了對舊數組的引用。 - 傳遞的元素保存在新數組的第 10 個單元格中。
- 大小變量增加 1 ,現在等於 11
在列表中間添加(插入)元素時會發生類似的情況。現有元素向右移動 1,並將傳遞的元素寫入數組新釋放的單元格。
現在我們將考慮涉及列表的最基本場景:
2. 添加一個元素到一個ArrayList
讓我們看一下在向列表中添加元素時列表內部會發生什麼。在創建 ArrayList 對像後,我們立即在內存中有這樣的東西:

我們有一個ArrayList包含兩個字段(兩個變量)的對象:一個容器(數組data)和存儲元素的數量 ( size)。該data變量存儲對可存儲 10 個元素的容器(數組)的引用。
如果我們決定將數字 5 添加到數組中,我們會得到下圖:

該數組現在存儲元素 5 和size == 1。
如果現在有人在我們的對像上調用該size()方法ArrayList,返回值將是列表中存儲的元素數: 1. 列表中的元素數與數組的存儲容量不同。
當前存儲容量和數組本身都無法在對像外部訪問(可見)ArrayList。這是並將永遠是ArrayList的內部數據。
讓我們再向列表中添加 7 個數字:10、20、30、40、50、60、70。
現在內存看起來像這樣:

如果您size()現在調用該方法,它將返回數字 8,這是列表中元素的新數量。該值與內部數組的大小無關。
這幅圖有一個過於簡單化的地方。
該類ArrayList不能存儲原始類型,因此它使用Integer類型而不是int. 容器不直接存儲值 {5, 10, 20, 30, 40, 50, 60, 70},而是對Integer對象的引用。容器存儲中的所有空單元格null。
3.增加列表的長度
讓我們看一下當列表的內部數組中不再有空單元格時,列表內部會發生什麼。
假設我們有一個包含 10 個元素的列表:

我們決定給它加上數字100。這是方法中發生的事情add():
第 1 步 — 創建一個新數組:

第 2 步 — 將舊數組中的所有元素複製到新數組中:

第 3 步 — 替換舊數組(更改對對象內部數組的引用ArrayList):

第 4 步 — 添加新號碼,這是我們努力完成的工作:

GO TO FULL VERSION