2013-07-29 98 views
1

我想知道當我實例化一個類的ArrayList。如果我通過給它一個初始大小聲明它像#2與#1相反,它會以某種方式更快嗎?或者我應該只給構造函數一個初始大小,如果我確切地知道我將添加到它的多少列?聲明一個ArrayList

  1. List<Column> columns = new ArrayList<Column>();
  2. List<Column> columns = new ArrayList<Column>(10);
+0

只是一個提示,從java 7開始,你不必在右側寫入類型。 - >'List columns = new ArrayList ()'to'List columns = new ArrayList <>()' – q99

回答

5

因爲他們的立場,有沒有區別兩者之間爲

構造函數中的參數用於指定List的默認初始容量,即10

或者我應該只給構造函數一個初始大小,如果我確切地知道有多少列將添加到它?

一般來說,如果你要在List添加了太多的元素頻繁,你可以給一個初始容量更大,從而使備份陣列不重新調整大小太多次了。 那麼,如果你有一個固定的大小,根本不會改變,你可以簡單地使用一個數組。

3

默認它分配10參考所以

證人它從source沒有差別

public ArrayList() { 
    this(10); 
} 

其用法是預測近似數,例如,如果你認爲它可能需要長達約25元,你認爲它會成長爲好,那麼就定義參數:initialCapacity到25避免陣列複製這是昂貴的操作

1

對於這種情況,兩個選項都有相同的結果。但是,我們應該漲了吧,並把它帶到一個通用的情況下,你問:

或者我應該只給構造函數的初始大小,如果我知道究竟有多少列,我會補充呢?

您可以這樣做,以避免當您添加一個元素,將超出列表的底層數組的界限時發生的大小調整。

檢查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); 
    } 
} 

設置初始已知的容量防止了這種大小調整。不過,如果你知道有多少元素可以使用,爲什麼不使用數組呢?

+2

最後這實際上是回答這個問題 – chancea

0

如果您確切知道將要放入ArrayList的成員數量,則提供初始容量(第二種情況)可以避免在列表增長時重新創建和複製基礎數組表示形式。

您的示例使用了10個成員,這恰好是ArrayList當前實現的默認大小。不過,我想你是在問一個更一般的情況。