312

ArrayListの初期サイズを設定するには、次のようにします。

ArrayList<Integer> arr=new ArrayList<Integer>(10);

しかし、あなたはできません

arr.add(5, 10);

範囲外の例外が発生するためです。

割り当てたスペースにアクセスできない場合、初期サイズを設定する用途は何ですか?

add関数はadd(int index, Object element)、インデックス10に追加しないように定義されています。

4

16 に答える 16

452

配列リストのサイズとその容量を混同しています。

  • サイズはリスト内の要素の数です。
  • 容量は、内部構造を再割り当てせずにリストが潜在的に収容できる要素の数です。

を呼び出すときは、リストのサイズではなくnew ArrayList<Integer>(10)、リストの初期容量を設定しています。言い換えると、この方法で構築されると、配列リストは空の状態から始まります。

配列リストに10個の要素を追加する1つの方法は、ループを使用することです。

for (int i = 0; i < 10; i++) {
  arr.add(0);
}

これにより、インデックス0..9の要素を変更できるようになります。

于 2012-01-17T14:59:25.500 に答える
141

事前定義されたサイズのリストが必要な場合は、次も使用できます。

List<Integer> arr = Arrays.asList(new Integer[10]);
于 2014-05-10T21:04:51.587 に答える
63

Collections.fill(list、obj);を使用する場合 繰り返しオブジェクトでリストを埋めるために、代わりに使用することができます

ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));

この行は、ArrayListに0を10回コピーします

于 2016-04-09T15:23:10.763 に答える
23

の容量はそのサイズArrayListと同じではありません。サイズは、 (およびその他の実装)に含まれる要素の数と同じです。ArrayListList

容量は、の要素を内部的に格納するために使用される基になる配列の長さであり、ArrayList常にリストのサイズ以上です。

set(index, element)リストを呼び出す場合、は、配列の長さ(=容量)(実装の詳細固有)ではなくindex、リスト要素の実際の数(=サイズ)(コードではゼロであるため、がスローされます)に関連します。AIOOBEArrayList)。

このメソッドは、実際には配列によって実装されるのではなく、エントリのリンクされたチェーンとして実装されるなど、setすべての実装に共通です。ListLinkedList

編集:実際にはadd(index, element)ではなくメソッドを使用しますset(index, element)が、原則はここでも同じです。

于 2012-01-17T15:07:26.927 に答える
10

インデックス付きの要素を追加する場合は、代わりに配列を使用できます。

    String [] test = new String[length];
    test[0] = "add";
于 2014-08-13T13:53:59.170 に答える
9

10はALの初期容量であり、サイズ(0)ではありません。要素を多く追加する場合は、初期容量を高い値に指定する必要があります。これは、要素を追加し続けるときに容量を拡張するオーバーヘッドを回避できるためです。

于 2012-01-17T14:57:54.413 に答える
6

あなたの質問に対する正確な答えは次のようになると思います。

ArrayListに初期サイズを設定すると、nrが減少します。多くの場合、内部メモリの再割り当てが発生する必要があります。リストは配列によって支えられています。つまり、初期容量0を指定した場合、要素の最初の挿入時に、内部配列のサイズを変更する必要があります。リストが保持する要素の数がおおよそわかっている場合は、初期容量を設定するとnrが減少します。リストの使用中に発生するメモリの再割り当ての数。

于 2012-01-17T15:13:33.233 に答える
6

これは誰かを助けるかもしれません-

ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
于 2018-06-14T08:38:41.137 に答える
6

これに遅れていますが、Java 8の後、私は個人的に、StreamAPIを使用したこの次のアプローチがより簡潔であり、受け入れられた答えの代わりになる可能性があると感じています。

例えば、

Arrays.stream(new int[size]).boxed().collect(Collectors.toList())

ここsizeで、は目的のListサイズであり、ここで説明する欠点がない場合、のすべての要素はとしListて初期化され0ます。

(クイック検索を行ったところ、stream投稿された回答は見つかりませんでした。この回答が冗長であり、削除できるかどうかをお気軽にお知らせください)

于 2019-02-26T05:05:08.930 に答える
3

現在、リストには要素がないため、リストが存在しない場合は、リストのインデックス5に追加できません。リストの容量と現在のサイズを混同しています。

電話するだけです:

arr.add(10)

ArrayListに整数を追加します

于 2012-01-17T15:01:36.667 に答える
3

同様の問題に直面しました。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);
于 2018-10-10T04:58:48.103 に答える
1

配列リストの容量は10ですが、実際のリストには要素がありません。addメソッドは、要素を実際のリストに挿入するために使用されます。要素がないため、5のインデックスに要素を挿入することはできません。

于 2014-02-11T07:51:17.390 に答える
1

10個のアイテムを追加したい場合は、次のArrayListことを試してください。

for (int i = 0; i < 10; i++)
    arr.add(i);

配列サイズ変数をすでに宣言している場合はsize、数値「10」の代わりに変数を使用します

于 2014-10-12T10:01:37.040 に答える
0

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インデックスで要素を追加し、次に1というように追加できます。* /

于 2015-03-11T14:15:01.570 に答える
0

私の2セントStream。使うほうがいいと思います

IntStream.generate(i -> MyClass.contruct())
         .limit(INT_SIZE)
         .collect(Collectors.toList());

初期値を柔軟に入力できます。

于 2019-08-29T12:53:05.407 に答える
0

貢献..

List <Destination\> destinations = Collections.nCopies(source.size(), Destination.class.newInstance());
于 2020-11-25T11:49:58.630 に答える