JavaでArrayListをすべてゼロで初期化するにはどうすればよいですか?


161

arraylistプレサイジングの仕事をしていないようです:

// presizing 

ArrayList<Integer> list = new ArrayList<Integer>(60);

その後、私がそれにアクセスしようとすると:

list.get(5) 

0を返す代わりに、IndexOutOfBoundsException:インデックス5が長さ0の範囲外をスローします

すべての要素をC ++のように正確なサイズの0に初期化する方法はありますか?


4
そのコンストラクターのJavadocは、「空のリスト」を作成することを指定しています。それはその仕事をしています。
ColinD

回答:


429

コンストラクタに渡される整数は、初期容量、つまり内部配列のサイズを変更する必要がある前に保持できる要素の数を表します(リストの初期要素数とは関係ありません)。

リストを60個のゼロで初期化するには、次のようにします。

List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, 0));

60の異なるオブジェクトを含むリストを作成する場合はSupplier、次のようにStream APIを使用できます。

List<Person> persons = Stream.generate(Person::new)
                             .limit(60)
                             .collect(Collectors.toList());

1
それは私の解決策よりもはるかに優れています(実際に動作する私の更新された解決策であっても)。私はArrayListそれから新しいものを作らないことを勧めます、そして代わりに単ににプログラムしListます。もちろん、それはOPに委ねられた決定です。
corsiKa

6
によって返されるリストnCopiesは不変なので、新しいリストを作成することArrayListはおそらく良い考えです。
aioobe

4
nCopies複雑なオブジェクトで使用する場合、コレクションは60の異なるオブジェクトでインスタンス化されず、同じオブジェクトで60回インスタンス化されることに注意してください。したがって、これはプリミティブにのみ使用してください。
メンバーズサウンド

1
@membersound、私はnCopies参照型で有用な多くのシナリオを考えることができます:文字列、nullオブジェクトパターン、列挙型定数などの不変オブジェクト...とにかく、60の異なるオブジェクトを作成するためのソリューションで回答を更新しました。
aioobe 2015年

@aioobe ncopiesが役立つシナリオはたくさんあります。変更可能なオブジェクトを使用してncopiesを試してみて、期待どおりに機能しないことに驚いたので、これを追加したかっただけです。念のため、誰かが同じタスクを試してみてください。更新してくれてありがとう!
membersound

12
// apparently this is broken. Whoops for me!
java.util.Collections.fill(list,new Integer(0));

// this is better
Integer[] data = new Integer[60];
Arrays.fill(data,new Integer(0));
List<Integer> list = Arrays.asList(data);

2
これは、既存のエントリでリストを埋めるだけです。必要に応じて要素で初期化しません。
WhiteFang34

これは60個のゼロでリストを埋めません。
aioobe

作成する必要がない場合でも、60個のオブジェクトが作成されます。
ColinD 2011

1
@Frost:あなたが得るだろうIndexOutOfBoundsExceptionList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
WhiteFang34

1
Arrays.asListList追加または削除を許可しないを生成するため、OPが必要とするものとはまったく異なります。あなたがする必要があるすべてがであればそれはsetうまくいきますが、その場合は単に配列を使う方が良いかもしれません。
ColinD

8

渡す60は、内部ストレージの初期容量にすぎません。それはあなたがそれがどれくらい大きいかもしれないと思うかについてのヒントです、それはもちろんそれによって制限されません。値を事前設定する必要がある場合は、次のように自分で設定する必要があります。

for (int i = 0; i < 60; i++) {
    list.add(0);
}

4

Java 8実装60ゼロで初期化されたリスト

List<Integer> list = IntStream.of(new int[60])
                    .boxed()
                    .collect(Collectors.toList());
  • new int[N] -ゼロと長さNで満たされた配列を作成します
  • boxed() -各要素を整数にボックス化
  • collect(Collectors.toList()) -ストリームの要素を収集します

0

それはそうではありません。ArrayListは、配列を内部再ペンテーションとして使用します。60以上の要素を追加すると、下にある配列が拡張されます。この配列に、持っているRAMと同じだけの要素を追加できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.