2016-07-04 16 views
2

次のコードは、外部から内部11の容量、 ArrayListの外部でensureCapacity()を使用する必要がある場合はありますか?

ArrayList list = new ArrayList(11); 

はなぜ、私は(パブリックメソッドensureCapacityを使用する必要があります/)を保証しますか?

なぜ公開されていないのですか? new ArrayList(n)を呼び出す

public void ensureCapacity(int minCapacity) { 
    int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) 
     // any size if not default element table 
     ? 0 
     // larger than default for default empty table. It's already 
     // supposed to be at default size. 
     : DEFAULT_CAPACITY; 

    if (minCapacity > minExpand) { 
     ensureExplicitCapacity(minCapacity); 
    } 
} 
+1

「?*なぜそれが維持され、公開*」ため「*公共一度、永遠に公共*」別名「*互換性*」。したがって、使用していない場合でも、*公開する必要がありました。 – Holger

+4

'ensureCapacity'の使用は、マイクロ最適化です。膨大な量のデータを処理するパフォーマンス重視のコードを管理している場合を除き、使用する必要はありません。 –

答えて

5

は容量nArrayList初期化します。

ただし、既に作成済みの多数の要素をこの場合に追加する場合があります。ArrayListArrayListがいっぱいです。 x新しい要素を追加したいとします。

list.ensureCapacity(n + x)を呼び出して要素を追加するほうが、要素を追加してListのサイズを動的に変更する方が効率的です。

この粗製の例考えてみましょう。あなたの場合ので、多くの再配分なしのアイテムの事前の数で知られている大規模なを追加する:あなたは主に可変長配列の容量を確保する他の方法としてensureCapacityを使用する必要があります

ArrayList<Integer> exampleList = new ArrayList<>(200); 

Integer[] exampleArray = new Integer[800]; 

exampleList.ensureCapacity(1000); 

Collections.addAll(exampleList, exampleArray); 
+0

ねえ、私はあなたのポイントを持っていますが、あなたはこれをどこで使うかの例を挙げることができますか?アプリケーションを作成しているうちにxが(n + x)になることはほとんどわからないので、これを尋ねています。また、すでに大きなセットがある場合は、たとえば、 リストのデータを入力するだけです。 data = database.getDatabase(); ArrayListの書籍=新しいArrayList(); 書籍。addAll(data); –

+0

私は間違っていますが、addAll()のドキュメントでは間違っています。** public boolean addAll(Collection c){ Object [] a = c.toArray(); int numNew = a.length; ensureCapacityInternal(size + numNew); // modCountをインクリメントします System.arraycopy(a、0、elementData、size、numNew); サイズ+ = numNew; 戻り値numNew!= 0; } **、内部的には同じことを意味しますが、なぜ明示的な呼び出しを行い、またすべての要素がarrayCopyによって一度に追加されるのかを示しますか? –

+1

@MilindVinkarはい私の申し訳ありませんが、私は間違った方法を見ていた、それは本質的に同じことを内部的に行うので 'addAll'を使用するユースケースはありません。 – explv

0

をアイテムのリストを1つずつ追加すると、アレイ容量の枯渇のために再割り当てが行われる可能性があります。

シンプルなシナリオでは、10要素の配列があり、再配置には2を成長因子として、1024個のアイテムを追加すると10個の再割り当てがあり、ensureCapacity(1034)が1つ(追加の開始時)です。

1

arrylistのサイズを自動的に調整したくない場合や、自分でコントロールしたい場合に使用する必要があります。例えば5サイズのArrayListを作成しました。 6番目の要素を追加すると、5 + 5、つまり10個の要素のためのスペースが作成されます。 arryListのサイズを2倍にしたくない場合は、list.ensureCapacityを使用して必要な要素の数を指定できます。

これは小さなデータでは問題ありませんが、arrayListが5Kに成長すると仮定します。 Javaドキュメントhttps://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html 1として

An application can increase the capacity of an ArrayList instance before adding a large number of elements using the ensureCapacity operation. This may reduce the amount of incremental reallocation. 
+0

したがって、明確にするために、コレクションにすでに大量のデータがある場合(たとえば、size> 5000)list.ensureCapacity(n + 1000) –

関連する問題