イマカラブログ

イマカラメガネの中の人が、芝居と関係あることないこと好き勝手に書くブログ。

オブジェクトの配列の初期化

思い出した

確かJava8になって簡潔に書けるようになってたよなーって思いつつ、結局、思い出せず手癖でループで初期化してたこんな感じのコード。

Object[] array = new Object[10];
for (int i = 0; i < array.length; i++) {
    array[i] = new Object();
}

Java8以降ではこう書ける。

Object[] array = new Object[10];
Arrays.setAll(array, i -> new Object());

わーい。すっきり。

おまけ

この手の奴はいつも性能が気になっちゃうので測定結果。

cpu=8
useFor              :   54   70   35   37   97   38   36   37   36   95 : avg=53.50
useSetAll           :   36   36   37   40   36   58   98   75   35   35 : avg=48.60
useParallelSetAll   :  241  239  238  238  237  249  236  236  235  236 : avg=238.50

測定したときのソース。

import java.util.Arrays;
import java.util.LongSummaryStatistics;

public class Test {

    static final int NUMER_OF_MEASURE = 10;
    static final int NUMBER_OF_RUN = 10000;
    static final int ARRAY_LENGTH = 1000;

    public static void main(String[] args) {
        int cpuNum = Runtime.getRuntime().availableProcessors();
        System.out.printf("cpu=%d%n", cpuNum);

        report("useFor", Test::useFor);
        report("useSetAll", Test::useSetAll);
        report("useParallelSetAll", Test::useParallelSetAll);
    }

    static void report(String name, Runnable runner) {
        measure(runner); // 空回し

        LongSummaryStatistics statics = new LongSummaryStatistics();
        
        System.out.printf("%-20s:", name);
        for (int i = 0; i < NUMER_OF_MEASURE; i++) {
            long time = measure(runner);
            statics.accept(time);
            System.out.printf("%,5d", time);
        }

        System.out.printf(" : avg=%,5.2f%n", statics.getAverage());
    }

    static long measure(Runnable runner) {
        long t = System.currentTimeMillis();
        for (int i = 0; i < NUMBER_OF_RUN; i++) {
            runner.run();
        }
        return System.currentTimeMillis() - t;
    }

    static void useFor() {
        Object[] array = new Object[ARRAY_LENGTH];
        for (int i = 0; i < array.length; i++) {
            array[i] = new Object();
        }
    }

    static void useSetAll() {
        Object[] array = new Object[ARRAY_LENGTH];
        Arrays.setAll(array, i -> new Object());
    }

    static void useParallelSetAll() {
        Object[] array = new Object[ARRAY_LENGTH];
        Arrays.parallelSetAll(array, i -> new Object());
    }

}