web-dev-qa-db-ja.com

ArrayListの初期サイズ

次のようにして、ArrayListの初期サイズを設定できます。

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

しかし、できません

arr.add(5, 10);

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

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

Add関数はadd(int index, Object element)として定義されているので、インデックス10には追加しません。

218
Cemre

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

  • sizeはリスト内の要素数です。
  • capacityは、リストがその内部構造を再割り当てすることなく収容できる要素の数です。

new ArrayList<Integer>(10)を呼び出すときは、リストのサイズではなく、リストの初期容量を設定しています。言い換えれば、このように構築されたとき、配列リストはその寿命を空にするようになります。

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

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

これで、インデックス0..9の要素を修正できます。

334
NPE

あなたが事前に定義されたサイズのリストが欲しいならば、あなたも使うことができます:

List<Integer> arr = Arrays.asList(new Integer[10]);
89

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

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

その行はあなたのArrayListに10回0をコピーする

39
Farzan Skt

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

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

リストでset(index, element)を呼び出すとき、indexはリストの要素の実際の数(= size)(コードでは0であるため、AIOOBEがスローされます)ではなく配列の長さ(= ArrayList)に固有の実装の詳細。

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

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

18
Natix

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

    String [] test = new String[length];
    test[0] = "add";
10
user3692587

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

9
Bhesh Gurung

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

ArrayListに初期サイズを設定すると、nrが小さくなります。内部メモリの再割り当てが必要になることがあります。リストは配列によって支えられています。つまり、初期容量0を指定すると、すでに要素の最初の挿入時に内部配列のサイズを変更する必要があります。リストの要素数を概算する場合は、初期容量を設定するとnrが小さくなります。リストを使用している間に発生したメモリの再割り当て.

6
quaylar

これには時間がかかりますが、Java 8の後に、私は個人的にはStream APIを使った次のようなアプローチをより簡潔に思い、 承認された回答

例えば、

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

ここでsizeは希望するListのサイズであり、 を指定しない場合は となり、Listのすべての要素は0として初期化されます。

(私はクイックサーチをしましたが、投稿された回答にstreamは表示されませんでした。この回答が冗長であり、削除できるかどうかは、遠慮なくお知らせください。)

2
H.T. Koo

これは誰かに役立つかもしれません -

ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
2

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

1
roll1987

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

ただ電話してください:

arr.add(10)

arrayListに整数を追加する

1
Hunter McMillen

ArrayListに10個の項目を追加したい場合は、次のようにしてください。

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

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

1
panther

Streamの2セント。使用したほうがいいと思う

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

任意の初期値を配置できる柔軟性を備えています。

0
anch2150

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のインデックスで要素を追加することができます。 * /

0
sambhu

私は同様の問題に直面し、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);
0
unk