18009


JavaのArrayListでは、「初期化時に確保するサイズを指定する」「ArrayList#ensureCapacityを使う」ことで、あらかじめ領域を確保できますよね？

[code]

    ArrayList<Integer> hoge = new ArrayList<Integer>(100); //確保1
    hoge.ensureCapacity(100); //確保2
    
[/code]

しかしどちらの書き方でも、C++でのstd::vectorにおけるreserve()のように「領域を確保する」だけであって、resize()のように「要素数が増える」わけじゃありませんよね。つまり、ArrayList#addで後ろに要素を追加はできるものの、ArrayList#setで特定位置に値を代入しようとするとIndexOutOfBoundsExceptionが生じてしまうのです。  
現在ではArrayList#addとforループでとりあえず全要素に0を敷き詰めて対処していますが、もっと綺麗に書く方法は無いものでしょうか。


CC BY-SA 3.0
2015-10-24T02:01:04.067
18006
2015-10-28T16:18:10.390
12939
question
java arraylist
JavaのArrayListでの領域確保方法について

[code]

    List<Integer> l = Collections.nCopies(5, 123) // 123,123,123,123,123
    ArrayList<Integer> al = new ArrayList(l); // もしArrayListが良ければ
    
[/code]

<http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#nCopies(int,%20T)>


CC BY-SA 3.0
2015-10-24T02:15:37.907
18007
2015-10-24T02:15:37.907
12940
18006
answer


`tai2` さんの回答と同じ事をしていますが、以下の様にも書けます。

[code]

    ArrayList<Integer> hoge = new ArrayList<Integer>(Arrays.asList(new Integer[100]));
    
[/code]

ただ、`nCopies` と異なって初期化はされません。

[code]

    hoge.set(0, 0);
    System.out.println(hoge);
    =>
    [0, null, null, ...
    
[/code]


CC BY-SA 3.0
2015-10-24T02:52:15.443
18009
2015-10-24T02:52:15.443
18006
answer


Stream が使える場合は、以下のように書けます。

[code]

    List<Integer> list = Stream.generate(() -> 0).limit(100).collect(Collectors.toList());
    
[/code]


CC BY-SA 3.0
2015-10-28T16:18:10.390
18182
2015-10-28T16:18:10.390
12985
18006
answer