1. 概要
Javaを使用すると、固定サイズの配列を作成したり、コレクションクラスを使用して同様の作業を実行したりできます。
このチュートリアルでは、ArrayListの容量と配列のサイズの違いを見ていきます。
また、 ArrayList を容量で初期化する必要がある場合の例と、メモリ使用量に関する長所と短所についても説明します。
2. 例
違いを理解するために、最初に両方のオプションを試してみましょう。
2.1. 配列のサイズ
javaでは、配列の新しいインスタンスを作成するときに、配列のサイズを指定する必要があります。
Integer[] array = new Integer[100];
System.out.println("Size of an array:" + array.length);
ここでは、サイズ100の I nteger 配列を作成しました。これにより、次の出力が得られました。
Size of an array:100
2.2. ArrayListの容量
それでは、初期容量が100のArrayListを作成しましょう。
List<Integer> list = new ArrayList<>(100);
System.out.println("Size of the list is :" + list.size());
Size of the list is :0
まだ要素が追加されていないため、サイズはゼロです。
それでは、リストに要素を追加して、そのサイズを確認しましょう。
list.add(10);
System.out.println("Size of the list is :" + list.size());
Size of the list is :1
3. 配列のサイズと ArrayList
以下は、配列のサイズとArrayList。の容量の主な違いです。
3.1. サイズの変更
配列は固定サイズです。サイズとしてint値を使用して配列を初期化すると、変更できなくなります。 サイズと容量も同じです。
ArrayListのサイズと容量は固定されていません。リストの論理サイズは、リスト内の要素の挿入と削除に基づいて変化します。 これは、物理ストレージサイズとは別に管理されます。 また、 ArrayList 容量のしきい値に達すると、容量が増加して、より多くの要素のためのスペースが確保されます。
3.2. メモリ割り当て
配列メモリは作成時に割り当てられます。 配列を初期化すると、配列のサイズとタイプに応じてメモリが割り当てられます。 すべての要素を、参照型の場合は null 値、プリミティブ型の場合はデフォルト値で初期化します。
配列リスト大きくなるにつれてメモリ割り当てを変更します。 初期化時に容量を指定すると配列リスト 、その容量までオブジェクトを格納するのに十分なメモリを割り当てます。 論理サイズは0のままです。 容量を拡張するときは、新しい、より大きな配列が作成され、値がそこにコピーされます。
空のArrayListオブジェクト用の特別なシングルトン0サイズの配列があるため、非常に安価に作成できることに注意してください。 ArrayListが内部でオブジェクト参照の配列を使用していることにも注意してください。
4. ArrayListを容量で初期化するタイミング
ArrayList を作成する前に必要なサイズがわかっている場合は、容量を初期化することを期待できますが、通常は必要ありません。 ただし、これが最良のオプションである理由はいくつかあります。
4.1. 大規模なArrayListの構築
リストが大きくなることがわかっている場合は、初期容量でリストを初期化することをお勧めします。 これにより、要素を追加するときにコストのかかる拡張操作を防ぐことができます。
同様に、リストが非常に大きい場合、自動拡張操作は、正確な最大サイズに必要な数よりも多くのメモリを割り当てる可能性があります。 これは、毎回の成長量がこれまでのサイズの割合として計算されているためです。 したがって、リストが大きい場合、これはメモリの浪費につながる可能性があります。
4.2. 小さな複数のArrayListの構築
小さなコレクションがたくさんある場合、 ArrayList の自動容量により、無駄なメモリの大部分が提供される可能性があります。 ArrayList は、要素数が少ない10のサイズを優先しますが、格納しているのは2または3のみであるとします。 これは、70%のメモリの浪費を意味します。これは、これらのリストが大量にある場合に問題になる可能性があります。
容量を事前に設定すると、この状況を回避できます。
5. 無駄を避ける
ArrayList は、ランダムアクセスをサポートする柔軟なサイズのオブジェクトのコンテナーに適したソリューションであることに注意してください。 配列よりもわずかに多くのメモリを消費しますが、より豊富な操作セットを提供します。
一部のユースケース、特にプリミティブ値の大規模なコレクションの場合、標準配列の方が高速で、使用するメモリが少なくなる可能性があります。
同様に、インデックスでアクセスする必要のない可変数の要素を格納する場合、LinkedListのパフォーマンスを向上させることができます。 メモリ管理のオーバーヘッドはありません。
6. 概要
この短い記事では、ArrayListの容量と配列のサイズの違いを確認しました。 また、 ArrayList を容量で初期化するタイミングと、メモリ使用量とパフォーマンスに関する利点についても検討しました。
いつものように、サンプルコードはGitHubでから入手できます。