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