WisdomSoft - for your serial experiences.

7.3 配列初期化子

配列も通常の変数と同じように、配列インスタンスの生成と同時に各要素の値を初期化できます。

7.3.1 配列の初期化

配列を生成した後、各要素に適切な値を代入することで初期化することができますが、構成要素の数が多い配列であれば、そのすべてに値を代入するのはとても面倒です。配列の宣言時に、すでに要素の初期値が決定しているのであれば、配列初期化子を用いることによって宣言と同時に所期化することが可能です。

配列初期化子とは変数宣言文の一部で、変数初期化子に分類されます。通常の変数では、式文を変数初期化子に指定することができましたが、配列変数の場合は式文ではなく配列初期化子を指定しなければならないとされています。配列初期化子は { } で囲まれ、その中に構成要素順で変数初期化子を指定します。各要素の値はカンマ , で区切られます。

{ 式文1 , 式文2 , 式文3 , ... }

配列初期化子では { } の中に、各要素の初期値を決定するための式文を指定することができます。配列のサイズは初期化子で指定した要素数にあわせて決定されます。例えば、次の数値型配列の初期化は有効です。

int iArray[] = { 1 , 10 , 100 , 1000 };

この場合、先頭インデックスから順に iArray[0] = 1、iArray[1] = 10、iArray[2] = 100、iArray[4] = 1000、という形で初期化されています。各要素を個別に代入式で初期化する方法に比べて、配列初期化子を用いればスマートに初期化することができます。配列初期化子に指定する各要素の初期値には、リテラルではなく式文を指定することができるため、クラス・インスタンス生成式を指定することで参照型の配列を初期化することもできます。

コード1
class Test {
	public static void main(String args[]) {
		int iArray[] = { 1 , 10 , 100 , 100 * 10 };

		for(int i = 0 ; i < 4 ; i++)
			System.out.println("iArray[" + i + "] = " + iArray[i]);

		String strArray[] = {
			"Blue Blue Grass Moon, Under The Crimson Air." ,
			new String("Twilight Grass Moon, Fairy Tale Princess.")
		};
		System.out.println("strArray[0] = " + strArray[0]);
		System.out.println("strArray[1] = " + strArray[1]);
	}
}
実行結果
>java Test
iArray[0] = 1
iArray[1] = 10
iArray[2] = 100
iArray[3] = 1000
strArray[0] = Blue Blue Grass Moon, Under The Crimson Air.
strArray[1] = Twilight Grass Moon, Fairy Tale Princess.

コード1では、数値型の配列と文字列方の配列を生成して、それを画面に表示しています。配列は配列初期化子によって宣言と同時に初期化されていることに注目してください。数値型の初期化では、先頭要素から順に 1、10、100、1000 という値で初期化されています。各要素の初期化子には式文が使えるため、最後は 100 * 10 という式で初期化していますね。

配列初期化子で指定する各要素の変数初期化子はリテラルである必要はないので、変数やクラス・インスタンス生成式を指定することも可能です。文字列の配列初期化子では文字列リテラルと、明示的な String コンストラクタ呼び出しによる初期化を行っています。C 言語では配列の初期化にリテラルしか使うことができませんでしたが、Java ではこの制約がないことを C 言語経験者は理解する必要があります。

7.3.2 配列生成式における初期化

配列初期化子は配列変数を宣言すると同時に指定しなければなりません。しかし、変数宣言時に要素が確定する定数的な性質を持つ配列を作成する必要に迫られることは、むしろ稀なケースといえるでしょう。配列初期化子がより効率的に働くと考えられるのは、変数宣言時よりも、配列生成式だと考えられます。そこで、配列生成式はインスタンスを生成すると同時に各要素を初期化する方法を提供しています。配列生成式で要素を初期化するには、次のような文を記述します。

配列初期化子
new 型名 [ ] 配列初期化子

このとき、ブラケットの中は空にしなければなりません。配列の要素数は変数初期化子で指定された式文の数で決定されます。

コード2
class Test {
	public static void main(String args[]) {
		int iArray[] = new int[] { 1 , 10 };
		System.out.println("iArray[0] = " + iArray[0]);
		System.out.println("iArray[1] = " + iArray[1]);

		iArray = new int[] { 100 , 1000 };
		System.out.println("iArray[0] = " + iArray[0]);
		System.out.println("iArray[1] = " + iArray[1]);
	}
}
実行結果
>java Test
iArray[0] = 1
iArray[1] = 10
iArray[0] = 100
iArray[1] = 1000

コード2のプログラムは、配列生成式で配列初期化子を指定する方法を用いて iArray 変数を初期化しています。変数宣言文であれば配列生成式を使わなくても、配列初期化子を用いて配列を生成することができます。しかし、変数宣言文以外の場所では、配列初期化子からインスタンスを生成することはできません。そこで、配列生成式で配列初期化子を指定し、インスタンスを生成すると同時に各要素を適切な値で初期化しています。