HOWTO · Java

Java ですべての配列要素をゼロに初期化する方法

Java で新しい配列が自動的にゼロで初期化される場合と、既存の配列をゼロに戻す方法を解説します。

このページの内容

新しく作成した Java のプリミティブ数値型配列は、各要素がゼロ値で初期化されるため、追加の処理は必要ありません。既存の配列をゼロに戻すには、Arrays.fill() を使うか、各要素に明示的に値を代入します。一方、Integer[] などの参照型配列の要素は、初期状態では null です。
配列の初期化は、Java チュートリアル の基本データの学習パスの一部として扱われています。

for ループで配列要素をゼロに初期化する

for ループを使うと、既存の配列の各インデックスに値を代入できます。インデックス 0 から始め、numbers.length に達する前にループを止めるため、有効な要素をすべて処理できます。

次の Java プログラムでは、短い配列に各方法を適用し、それぞれの結果を出力します。

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class ArrayInitialization {
  public static void main(String[] args) {
    int[] loopValues = {4, 8, 12};
    for (int i = 0; i < loopValues.length; i++) {
      loopValues[i] = 0;
    }
    System.out.println("for loop: " + Arrays.toString(loopValues));

    int[] filledValues = {4, 8, 12};
    Arrays.fill(filledValues, 0);
    System.out.println("fill: " + Arrays.toString(filledValues));

    List<Integer> repeatedValues = Collections.nCopies(3, 0);
    Integer[] boxedValues = repeatedValues.toArray(new Integer[0]);
    System.out.println("boxed values: " + Arrays.toString(boxedValues));

    int[] numbers = {4, 8, 12};
    int[] oldReference = numbers;
    numbers = new int[numbers.length];
    System.out.println("replacement: " + Arrays.toString(numbers));
    System.out.println("old reference: " + Arrays.toString(oldReference));

    int[] generatedValues = {4, 8, 12};
    Arrays.setAll(generatedValues, index -> 0);
    System.out.println("setAll: " + Arrays.toString(generatedValues));

    int[] newValues = new int[3];
    System.out.println("new array: " + Arrays.toString(newValues));
  }
}

プログラムの出力は次のとおりです。

for loop: [0, 0, 0]
fill: [0, 0, 0]
boxed values: [0, 0, 0]
replacement: [0, 0, 0]
old reference: [4, 8, 12]
setAll: [0, 0, 0]
new array: [0, 0, 0]

Java の fill() メソッドで配列要素をゼロに初期化する

Arrays.fill() は、指定した値を配列のすべての要素に書き込みます。プリミティブ数値型配列なら、Arrays.fill(numbers, 0) によって既存の配列をその場でゼロに戻せます。配列の一部だけを変更したい場合に使える、範囲を指定するオーバーロードもあります。

nCopies() メソッドで配列要素をゼロに初期化する

Collections.nCopies(length, 0) は、同じボックス化された値を並べた変更不可能な List<Integer> を返します。このリストを toArray(new Integer[0]) で変換すると Integer[] が作られます。int[] が作られるわけではなく、既存のプリミティブ配列がリセットされることもありません。リストまたはボックス化された配列が必要な場合に使い、元の配列を変更する方法の代わりにはしないでください。

Java で配列を再代入して要素をゼロにする

new int[numbers.length] を numbers に代入すると、numbers はデフォルト値が設定された新しい配列を参照します。元の配列を参照している別の変数からは、引き続き以前の内容が見えます。再代入で置き換わるのは一つの参照であり、古い配列を参照するすべての変数に対して内容が消去されるわけではありません。

Arrays.setAll() で配列要素をゼロに初期化する

Arrays.setAll() は、各要素に対してインデックスを使う生成関数を呼び出し、その戻り値を配列に格納します。例では index -> 0 を使い、すべてのインデックスに同じ値を代入しています。インデックスに応じて値を変えたい場合に便利です。すべての要素に同じ定数を入れるだけなら、Arrays.fill() のほうが直接的です。

まとめ

新しいプリミティブ数値型配列は、作成時にすでにゼロで初期化されています。既存の配列をリセットする場合は、Arrays.fill() が直接的な方法です。for ループなら要素ごとの代入を明示でき、Arrays.setAll() ならインデックスに基づいて値を設定できます。Collections.nCopies() はリスト内にボックス化された値を繰り返し作り、再代入は新しい配列を作成するため、古い配列への別の参照はそのまま残ります。