我想知道當我實例化一個類的ArrayList。如果我通過給它一個初始大小聲明它像#2與#1相反,它會以某種方式更快嗎?或者我應該只給構造函數一個初始大小,如果我確切地知道我將添加到它的多少列?聲明一個ArrayList
List<Column> columns = new ArrayList<Column>();
List<Column> columns = new ArrayList<Column>(10);
我想知道當我實例化一個類的ArrayList。如果我通過給它一個初始大小聲明它像#2與#1相反,它會以某種方式更快嗎?或者我應該只給構造函數一個初始大小,如果我確切地知道我將添加到它的多少列?聲明一個ArrayList
List<Column> columns = new ArrayList<Column>();
List<Column> columns = new ArrayList<Column>(10);
因爲他們的立場,有沒有區別兩者之間爲。
構造函數中的參數用於指定List
的默認初始容量,即10
。
或者我應該只給構造函數一個初始大小,如果我確切地知道有多少列將添加到它?
一般來說,如果你要在List
添加了太多的元素頻繁,你可以給一個初始容量更大,從而使備份陣列不重新調整大小太多次了。 那麼,如果你有一個固定的大小,根本不會改變,你可以簡單地使用一個數組。
默認它分配10
參考所以
證人它從source沒有差別
public ArrayList() {
this(10);
}
其用法是預測近似數,例如,如果你認爲它可能需要長達約25元,你認爲它會成長爲好,那麼就定義參數:initialCapacity到25
避免陣列複製這是昂貴的操作
對於這種情況,兩個選項都有相同的結果。但是,我們應該漲了吧,並把它帶到一個通用的情況下,你問:
或者我應該只給構造函數的初始大小,如果我知道究竟有多少列,我會補充呢?
您可以這樣做,以避免當您添加一個元素,將超出列表的底層數組的界限時發生的大小調整。
檢查ArrayList
的代碼:
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
ensureCapacity
是調整大小列表的基礎數組,如果它是實際上是‘滿’的方法:
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
設置初始已知的容量防止了這種大小調整。不過,如果你知道有多少元素可以使用,爲什麼不使用數組呢?
最後這實際上是回答這個問題 – chancea
如果您確切知道將要放入ArrayList的成員數量,則提供初始容量(第二種情況)可以避免在列表增長時重新創建和複製基礎數組表示形式。
您的示例使用了10個成員,這恰好是ArrayList當前實現的默認大小。不過,我想你是在問一個更一般的情況。
只是一個提示,從java 7開始,你不必在右側寫入類型。 - >'List columns = new ArrayList ()'to'List columns = new ArrayList <>()' –
q99