Java ArrayList的自動擴容機制

2021-08-21 21:33:18 字數 2425 閱讀 3274

注意:

不同的jdk版本的擴容機制可能有差異

實驗環境:jdk1.8

擴容機制

當向arraylist中新增元素的時候,arraylist如果要滿足新元素的儲存超過arraylist儲存新元素前的儲存能力,arraylist會增強自身的儲存能力,已達到儲存新元素的要求

arraylist:本質通過內部維護的陣列物件進行資料儲存

①:分析arraylist的add(e)方法

public boolean add(e e)
分析:add方法首先通過ensurecapacityinternal()方法確保當前arraylist維護的陣列具有儲存新元素的能力,經過處理之後將元素儲存在陣列elementdata的尾部

elementdata:arraylist真正用於儲存元素的陣列

②:分析ensurecapacityinternal方法

private void ensurecapacityinternal(int mincapacity) 

ensureexplicitcapacity(mincapacity);

}

分析:ensurecapacityinternal判斷arraylist預設的元素儲存資料是否為空,為空則設定最小要求的儲存能力為必要儲存的元素和預設儲存元素個數的兩個資料之間的最大值,然後呼叫ensureexplicitcapacity方法實現這種最低要求的儲存能力

注意:arraylist的儲存空間並不是需要乙個建立乙個,而是分階段性的建立,一般會預留儲存空間。

例如,如果arraylist需要儲存10個元素,恰好arraylist只能儲存6個元素,剩餘4個元素無法儲存,arraylist可能會一次性擴充套件10個元素,這種arraylist就有20個元素的儲存能力,在儲存能力範圍內,下次再存放元素,就不需要再次擴容

③:分析ensureexplicitcapacity方法:

private void ensureexplicitcapacity(int mincapacity)
分析:如果最低要求的儲存能力》arraylist已有的儲存能力,這就表示arraylist的儲存能力不足,因此需要呼叫 grow();方法進行擴容

④:分析grow()方法

private void grow(int mincapacity)
分析:當arraylist擴容的時候,首先會設定新的儲存能力為原來的1.5倍

int newcapacity = oldcapacity + (oldcapacity >> 1);
如果擴容之後還是不能滿足要求則max_array_size比較,求取最大值,

如果max_array_size大小的能力還是不能滿足則通過hugecapacity()方法獲取arraylist能允許的最大值:

private static int hugecapacity(int mincapacity)
從hugecapacity方法看出,arraylist最大的儲存能力:儲存元素的個數為整型的範圍。

確定arraylist擴容之後最新的可儲存元素個數時,呼叫

elementdata = arrays.copyof(elementdata, newcapacity);

實現elementdata陣列的擴容,整個流程就是arraylist的自動擴容機制工作流程

擴充套件:arraylist的自動擴容機制底層借助於system實現

public static native void arraycopy

(object src, int srcpos,

object dest, int destpos,

int length);

arraycopy標識為native意味jdk的本地庫,不可避免的會進行io操作,如果頻繁的對arraylist進行擴容,毫不疑問會降低arraylist的使用效能,因此當我們確定新增元素的個數的時候,我們可以事先知道並指定arraylist的可儲存元素的個數,這樣當我們向arraylist中加入元素的時候,就可以避免arraylist的自動擴容,從而提高arraylist的效能

arraylist含參建構函式:初始化時指定儲存元素的能力:

public arraylist(int initialcapacity)  else if (initialcapacity == 0)  else 

}

Java ArrayList擴容機制

底部採用動態陣列實現資料增加,刪除。size arraylist的實際存放資料個數,即我們常說的list長度,size 函式 elementdate elementdate,arraylist實際存放資料的陣列,可動態擴容,我們所說的就是動態改變elementdate.length,從而達到擴容,實...

JAVA ArrayList的淺複製問題

arraylist的add方法的原始碼,可以看到僅僅是把物件用 號複製了一下,但是更改如果更改外邊的e的話,arraylist裡的物件就會隨之改變 public boolean add e e 測試 public class sayhello public static class test imp...

java ArrayList原始碼學習

該類繼承於abstractlist,裡面對於資料和結構的操作如下。trimtosize 更新size,如果size小於 陣列的 lenth,則更新size的大小。public void ensurecapacity int mincapacity 確保容量,如果不夠就擴容成原來的1.5倍 1 pub...