次のようにして、ArrayListの初期サイズを設定できます。
ArrayList<Integer> arr=new ArrayList<Integer>(10);
しかし、できません
arr.add(5, 10);
範囲外の例外が発生するためです。
割り当てたスペースにアクセスできない場合の初期サイズの設定の用途は何ですか?
Add関数は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
の容量は、そのサイズと同じではありません。 Sizeは、ArrayList
(およびその他のList
の実装)に含まれる要素の数と同じです。
容量は、ArrayList
の要素を内部的に格納するために使用される、基礎となる配列の長さです。常にサイズ以上です。リストの.
リストでset(index, element)
を呼び出すとき、index
はリストの要素の実際の数(= size)(コードでは0であるため、AIOOBE
がスローされます)ではなく配列の長さ(= ArrayList
)に固有の実装の詳細。
set
メソッドは、実際には配列ではなく、リンクされたエントリのチェーンとして実装されているList
など、すべてのLinkedList
実装に共通です。
編集:実際にはadd(index, element)
ではなくset(index, element)
メソッドを使用しますが、原則はここでも同じです。
インデックス付きの要素を追加したい場合は、代わりに配列を使用できます。
String [] test = new String[length];
test[0] = "add";
10はALの初期容量であり、サイズ(0)ではありません。要素を追加するときに容量を拡張することによるオーバーヘッドが回避されるため、大量の要素がある場合は、初期容量をいくらか高い値に設定する必要があります。
あなたの質問に対する正確な答えは次のようになると思います。
ArrayListに初期サイズを設定すると、nrが小さくなります。内部メモリの再割り当てが必要になることがあります。リストは配列によって支えられています。つまり、初期容量0を指定すると、すでに要素の最初の挿入時に内部配列のサイズを変更する必要があります。リストの要素数を概算する場合は、初期容量を設定するとnrが小さくなります。リストを使用している間に発生したメモリの再割り当て.
これは誰かに役立つかもしれません -
ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
あなたのアレイリストの容量は10ですが、実際のリストには要素はありません。 addメソッドは、実リストに要素を挿入するために使用されます。要素がないため、5のインデックスに要素を挿入することはできません。
現時点ではリストに要素はありませんので、リスト5が存在しない場合はインデックス5に追加することはできません。リストの容量と現在のサイズを混同しています。
ただ電話してください:
arr.add(10)
arrayListに整数を追加する
ArrayList
に10個の項目を追加したい場合は、次のようにしてください。
for (int i = 0; i < 10; i++)
arr.add(i);
すでに配列サイズの変数を宣言している場合は、番号 '10'の代わりに変数size
を使用します。
Stream
の2セント。使用したほうがいいと思う
IntStream.generate(i -> MyClass.contruct())
.limit(INT_SIZE)
.collect(Collectors.toList());
任意の初期値を配置できる柔軟性を備えています。
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のインデックスで要素を追加することができます。 * /
私は同様の問題に直面し、arrayListがListインタフェースのサイズ変更可能な配列の実装であることを知っているだけで、私はあなたが任意の点に要素を追加できることを期待しますとにかく、最初に配列を作成し、それを次のようなリストに変換することができます。
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);