1.ArrayList結構如何

ArrayList是最常用於存儲元素的 Java 類。那麼如何ArrayList工作以及為什麼每個人都如此喜歡它?

結構ArrayList簡單巧妙。每個ArrayList對象包含兩個字段:

  • 元素數組
  • 一個size變量,它存儲列表中元素的數量

在內部,一個ArrayList對象包含一個最普通的數組!但這還不是全部。還有一個大小變量,它存儲列表的長度。它是這樣工作的:

最初,列表中數組的長度為 10。變量size為 0。

如果向列表中添加一個元素,它將存儲在數組的第 0 個單元格中,並將size增加到 1。

如果再添加一個元素,它將存儲在第一個單元格中,並size再次增加 1 並等於 2。

如果在數組中沒有更多空間時添加另一個元素,則方法中會發生以下情況add()

  1. 創建一個新數組,其長度是前一個數組長度的一倍半
  2. 舊數組的所有元素都被複製到新數組中。
  3. 在該ArrayList對像中,對新數組的引用替換了對舊數組的引用
  4. 傳遞的元素保存在新數組的第 10 個單元格中。
  5. 大小變量增加 1 現在等於 11

在列表中間添加(插入)元素時會發生類似的情況。現有元素向右移動 1,並將傳遞的元素寫入數組新釋放的單元格。

現在我們將考慮涉及列表的最基本場景:


2. 添加一個元素到一個ArrayList

讓我們看一下在向列表中添加元素時列表內部會發生什麼。在創建 ArrayList 對像後,我們立即在內存中有這樣的東西:

向 ArrayList 添加元素

我們有一個ArrayList包含兩個字段(兩個變量)的對象:一個容器(數組data)和存儲元素的數量 ( size)。該data變量存儲對可存儲 10 個元素的容器(數組)的引用。

如果我們決定將數字 5 添加到數組中,我們會得到下圖:

將元素添加到 ArrayList 2

該數組現在存儲元素 5 和size == 1

如果現在有人在我們的對像上調用該size()方法ArrayList,返回值將是列表中存儲的元素數: 1. 列表中的元素數與數組的存儲容量不同。

當前存儲容量和數組本身都無法在對像外部訪問(可見)ArrayList。這是並將永遠是ArrayList的內部數據。

讓我們再向列表中添加 7 個數字:10、20、30、40、50、60、70。

現在內存看起來像這樣:

向 ArrayList 添加元素

如果您size()現在調用該方法,它將返回數字 8,這是列表中元素的新數量。該值與內部數組的大小無關。

重要的:

這幅圖有一個過於簡單化的地方。

該類ArrayList不能存儲原始類型,因此它使用Integer類型而不是int. 容器不直接存儲值 {5, 10, 20, 30, 40, 50, 60, 70},而是對Integer對象的引用。容器存儲中的所有空單元格null



3.增加列表的長度

讓我們看一下當列表的內部數組中不再有空單元格時,列表內部會發生什麼。

假設我們有一個包含 10 個元素的列表:

增加列表的長度

我們決定給它加上數字100。這是方法中發生的事情add()

第 1 步 — 創建一個新數組:

增加列表的長度 2

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

增加列表的長度 2

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

增加列表的長度 3

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

增加列表的長度 4