本篇通過閱讀jdk1.8原始碼,了解arraylist是如何進行自動擴容的。
初始化無參構造方法建立arraylist()
arraylist arraylist = new arraylist();
原始碼:
private static final object defaultcapacity_empty_elementdata = {};
public arraylist()
將預設的大小為0的object陣列
賦值給elementdata
實現初始化。
指定容量的夠著方法建立arraylist()
arraylist arraylist = new arraylist(14);
原始碼:
private static final object empty_elementdata = {};
public arraylist(int initialcapacity) else if (initialcapacity == 0) else
}
自動擴容
當新增元素時,會根據情況進行是否擴容。
public boolean add(e e)
public boolean addall(collection<? extends e> c)
再看ensurecapacityinternal
是如何確保內部容量的
//mincapacity 陣列需要的最小容量,(原容量+新增元素個數)
private void ensurecapacityinternal(int mincapacity)
calculatecapacity
如何計算容量
private static final int default_capacity = 10;//預設擴容容量
private static int calculatecapacity(object elementdata, int mincapacity)
return mincapacity;
}
接下來看ensureexplicitcapacity
:
private void ensureexplicitcapacity(int mincapacity)
擴容方法:
private void grow(int mincapacity)
重新計算大容量:
private static int hugecapacity(int mincapacity)
總結 JDK1 8 ArrayList擴容機制原始碼分析
屬性 預設長度 private static final int default capacity 10 空陣列 有參構造器 private static final object empty elementdata 空陣列 無參構造器 private static final object def...
ArrayList擴容機制
1.成員變數 預設給定的初始容量 private static final int default capacity 10 無參構造器中所使用到的空陣列例項 private static final object empty elementdata 有參構造器中所使用到的空陣列例項 private ...
ArrayList擴容機制
arraylist實現了list介面。它是乙個可調整大小的陣列,可以用來存放各種形式的資料。並提供了包括crud在內的多種方法可以對資料進行操作,但是它不是執行緒安全的。list擴容實現步驟總的來說就是分兩步 陣列定義的時候,因為需要給它分配連續的記憶體空間,需要預先指定其大小。因此當存放的資料大於...