2015-06-14 20 views
0

我有一個2維ArrayList對象的ensureCapacity()用於內部ArrayList的

private ArrayList<ArrayList<Short>> VOL_2D = new ArrayList<ArrayList<Short>>(); 

現在我想打電話給.ensureCapacity()外部列表和所有的內部名單上都(內列出的數量是知道的,但他們還沒有初始化)。對於外部列表來說很簡單,我只是定義了我想要適合的內部列表。

有號召內列出了該方法的一個很好的方式?或者我每次初始化一個新的內部列表時都必須調用它?

+0

你是什麼意思'尚未初始化? – AdamSkywalker

+0

你打算如何調用一個不存在的對象的方法? –

回答

4

沒有像「2維ArrayList對象」那樣的東西。你有一個ArrayList其中存儲ArrayList對象。存儲在外部列表中的所有對象可能具有不同的大小,其中一些可能是nullArrayList的子類。所以,你必須明確地添加足夠ArrayList對象到外數組列表:

int n = // size of the outer list 
int m = // size of the inner lists 
private ArrayList<ArrayList<Short>> VOL_2D = new ArrayList<ArrayList<Short>>(n); 
for(int i=0; i<n; i++) 
    VOL_2D.add(new ArrayList<>(m)); 

請注意:ensureCapacity沒有任何實際的元素添加到列表中。它只是調整內部數組以適應指定數量的元素,所以後續調整大小將不是必需的。創建一個空的ArrayList並在此之後立即調用ensureCapacity毫無意義:最好使用構造函數,它將以更有效的方式執行相同的操作。無論如何,ensureCapacity只是爲了提高性能。如果你確實想擁有這些列表中的元素,你可以使用:

for(int i=0; i<n; i++) { 
    ArrayList<Short> inner = new ArrayList<>(m); 
    for(int j=0; j<m; j++) 
     inner.add(null); // or some other initial value 
    VOL_2D.add(inner); 
} 

最後,如果你想擁有固定大小的二維ArrayList,爲什麼不創建數組這樣嗎?

private short[][] VOL_2D = new short[n][m]; 

這將是更高性能。

0

看來你不明白這是什麼結構的真正含義。你看,那些「內部」列表不知道它們可能被收集在一些外部列表中。所以有沒有方式(很容易)實現你在找什麼。

雖然有一種可能:你可以擴展ArrayList;在你自己的類中,你可以覆蓋所有可以「添加」ArrayList的方法......你可以做任何你想做的事情;例如設置所需的容量。

0

你不需要調用ensureCapacity

這只是用於優化,以避免潛在的陣列的不必要的重新分配的方法。

docs

應用程序可以添加大量使用的ensureCapacity 操作元件的前增大ArrayList實例 的容量。這可能會減少增量重新分配的數量。

0

如果外部ArrayList的大小是已知的,並修復,那麼我會建議你使用數組而不是ArrayList,如下所示。

int size = 10; 

ArrayList<Short>[] VOL_2D = new ArrayList<Short>[size]; 

爲什麼您需要撥打ensureCapacity(int minCapacity)?你能詳細說明你的用例嗎?因爲當你創建實例時,你可以指定ArrayList的大小。像下面

VOL_2D[0] = new ArrayList<Short>(30); 

這將調用下面的構造,創造的30

public ArrayList(int initialCapacity) { 
     super(); 
     if (initialCapacity < 0) 
      throw new IllegalArgumentException("Illegal Capacity: "+ 
               initialCapacity); 
     this.elementData = new Object[initialCapacity]; 
    } 

數組大小要回答你的問題,沒有一個統一的內置方法,該方法將遍歷在列表中的所有元素調用ensureCapacity。

你需要編寫代碼這一點,像下面

for(ArrayList<Short> vol : VOL_2D){ 
    vol.ensureCapacity(30); 
} 

記住這一點,之前調用的ensureCapacity方法,你需要初始化ArrayList對象(在你的情況下,所有內部ArrayList對象),否則你將結束與NullPointerException。

相關問題