Java ArrayList自動擴容機制

2021-09-25 06:24:55 字數 1647 閱讀 5685

arraylist介紹

arraylist底層是基於陣列實現的,是乙個動態陣列,自動擴容。

arraylist不是執行緒安全的,只能用在單執行緒環境下。

實現了serializable介面,因此它支援序列化,能夠通過序列化傳輸;

實現了randomaccess介面,支援快速隨機訪問,實際上就是通過下標序號進行快速訪問;

實現了cloneable介面,能被轉殖。

動態擴容

一 初始化

jdk1.7通過無參構造方法(初始長度預設10,以預設的大小來初始化內部的陣列)、有參構造方法對陣列進行初始化。

二  確保內部容量

通過判斷,如果夠則不進行操作;容量不夠就擴充來確保內部容量。

① ensurecapacityinternal方法名的英文大致是「確保內部容量」,size表示的是執行新增之前的元素個數,並非arraylist的容量,容量應該是陣列elementdata的長度。ensurecapacityinternal該方法通過將現有的元素個數陣列的容量比較。看如果需要擴容,則擴容。 

②是將要新增的元素放置到相應的陣列中。 

*根據傳入的最小需要容量mincapacity來和陣列的容量長度對比,如果mincapacity大於或等於陣列容量,則需要進行擴容。

三 擴容

private void grow(int mincapacity)
綜述:arraylist在第一次插入元素add()時分配10(預設)個物件空間。假如有20個資料需要新增,那麼會在第11個資料的時候(原始陣列容量存滿時),按照1.5倍增長;之後擴容會按照1.5倍增長(10、15、22、、、)。

每次擴容都是通過arrays.copyof(elementdata, newcapacity) 這樣的方式實現的。arraylist的自動擴容機制底層借助於system實現system.arraycopy(0,oldsrc,0,newsrc,length);

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

注意:實現環境:jdk1.7。(注:不同版本的jdk擴容機制略有區別)

jdk1.8擴容機制:

重寫list.add(),get(),equal(),remove(),size():

Java ArrayList自動擴容機制

arraylist底層是基於陣列實現的,是乙個動態陣列,自動擴容。arraylist不是執行緒安全的,只能用在單執行緒環境下。實現了serializable介面,因此它支援序列化,能夠通過序列化傳輸 實現了randomaccess介面,支援快速隨機訪問,實際上就是通過下標序號進行快速訪問 實現了cl...

Java ArrayList的自動擴容機制

注意 不同的jdk版本的擴容機制可能有差異 實驗環境 jdk1.8 擴容機制 當向arraylist中新增元素的時候,arraylist如果要滿足新元素的儲存超過arraylist儲存新元素前的儲存能力,arraylist會增強自身的儲存能力,已達到儲存新元素的要求 arraylist 本質通過內部...

Java ArrayList擴容機制

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