ArrayListの初期サイズ
-
29-10-2019 - |
質問
ArrayListの初期サイズを実行することで設定できます
ArrayList<Integer> arr=new ArrayList<Integer>(10);
ただし、できません
arr.add(5, 10);
それは範囲外の例外を引き起こすからです。
割り当てられたスペースにアクセスできない場合、初期サイズの設定の使用は何ですか?
追加関数は次のように定義されています add(int index, Object element)
したがって、私はインデックス10に追加していません。
解決
配列リストのサイズをその容量と混同しています。
- サイズ リスト内の要素の数です。
- 容量 リストが内部構造を再配置せずに潜在的に収容できる要素の数です。
あなたが電話するとき new ArrayList<Integer>(10)
, 、リストの初期を設定しています 容量, 、そのサイズではありません。言い換えれば、この方法で構築されると、配列リストはその寿命が空いています。
配列リストに10個の要素を追加する1つの方法は、ループを使用することです。
for (int i = 0; i < 10; i++) {
arr.add(0);
}
これを行った後、インデックス0..9で要素を変更できるようになりました。
他のヒント
事前定義されたサイズのリストが必要な場合は、以下を使用することもできます。
List<Integer> arr = Arrays.asList(new Integer[10]);
collections.fill(list、obj)を使用する場合。リストを繰り返しオブジェクトで埋めるために、それを使用することができます
ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));
ラインはArrayListに10回0をコピーします
容量 の ArrayList
それと同じではありません サイズ. サイズ に含まれる要素の数に等しい ArrayList
(およびその他 List
実装)。
容量 の要素を内部に保存するために使用される基礎となる配列の長さだけです ArrayList
, 、そして常に大きいか等しい サイズ リストの。
電話するとき set(index, element)
リストに、 index
リスト要素の実際の数(=サイズ)に関連しています(これはコードではゼロです。したがって、 AIOOBE
アレイの長さ(=容量)ではなく、スローされます)(これは、に固有の実装の詳細です ArrayList
).
set
方法はすべてに共通しています List
などの実装 LinkedList
, 、実際には配列によって実装されるのではなく、リンクされたエントリチェーンとして実装されています。
編集: :実際に使用します add(index, element)
方法ではありません set(index, element)
, 、しかし、原則はここで同じです。
インデックス付きの要素を追加する場合は、代わりに配列を使用できます。
String [] test = new String[length];
test[0] = "add";
10はALの初期容量であり、サイズ(0です)ではありません。要素を追加し続けるときに容量を拡大するオーバーヘッドを回避するため、多くの要素を持つ場合、初期容量をある程度の価値のある容量に言及する必要があります。
あなたの質問に対する正確な答えは次のとおりです。
ArrayListにINTIALサイズを設定すると、NRが減少します。時間の内部メモリの再配分が発生する必要があります。リストは配列で裏付けられています。 IEの初期容量0を指定している場合、要素の最初の挿入時に、内部配列のサイズを変更する必要があります。リストがどれだけの要素を保持するかについてのおおよそのアイデアがある場合、初期容量を設定するとNRが減少します。リストを使用している間に発生するメモリ再割り当ての。
これは誰かを助けるかもしれません -
ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
これに遅れたが、その後 Java 8, 、私は個人的に、次のアプローチを見つけました Stream
APIはより簡潔で、代替手段になる可能性があります 受け入れられた答え.
例えば、
Arrays.stream(new int[size]).boxed().collect(Collectors.toList())
どこ size
望ましいです List
サイズとなし ここで言及されている欠点, 、のすべての要素 List
ASとして初期化されます 0
.
(私は簡単な検索をしました、そして見ませんでした stream
投稿された回答で - この回答が冗長であり、削除できるかどうかをお気軽にお知らせください)
現在、リストには要素がないため、リストが存在しない場合は、リストのインデックス5に追加することはできません。リストの容量を現在のサイズと混同しています。
コールするだけです:
arr.add(10)
ArrayListに整数を追加します
ArrayListの容量は10ですが、実際のリストにはここには要素がありません。 ADDメソッドは、実際のリストに要素を挿入するために使用されます。要素がないため、5のインデックスに要素を挿入することはできません。
10個のアイテムを追加したい場合 ArrayList
あなたはそれを試すかもしれません:
for (int i = 0; i < 10; i++)
arr.add(i);
すでに配列サイズ変数を宣言している場合は、変数を使用します size
数字「10」の代わりに
私は同様の問題に直面しましたが、ArrayListがリストインターフェイスの再配置可能な実装であることを知っているだけで、あらゆるポイントに要素を追加できるが、少なくとも初期サイズを定義するオプションがあることも期待しています。とにかく、最初に配列を作成し、それを次のようなリストに変換できます。
int index = 5;
int size = 10;
Integer[] array = new Integer[size];
array[index] = value;
...
List<Integer> list = Arrays.asList(array);
また
List<Integer> list = Arrays.asList(new Integer[size]);
list.set(index, value);
arrayList myList = new ArrayList(10);
// myList.add(3, "DDD");
// myList.add(9, "III");
myList.add(0, "AAA");
myList.add(1, "BBB");
for(String item:myList){
System.out.println("inside list : "+item);
}
/*ArrayListの初期カパシティは、内部的にシフト時間を節約することに他なりません。要素を内部的に追加すると、カパシティをチェックしてカパシティを増加させると、最初に0インデックスに要素を追加することができます。 */
私の2セント Stream
. 。使用する方が良いと思います
IntStream.generate(i -> MyClass.contruct())
.limit(INT_SIZE)
.collect(Collectors.toList());
初期値を柔軟に配置する柔軟性を備えています。