頭脳一式

人の記憶なんて曖昧なもの。すべての情報を頭に記憶するなんてナンセンス。困ったらここに来ればいいじゃん?

【Java SE8 Silver】配列の宣言と配列インスタンスの生成

Javaの配列はややこしいのでまとめてみる。

配列の宣言方法

配列の宣言には大カッコを使う。
データ型の後ろに記述するパターンと変数名の後ろに記述するパターンの2通りある。

int[] array;//データ型の後ろに大カッコを記述するパターン。
int array[]://変数名の後ろに大かっこを記述するパターン。

多次元配列の場合は、大カッコの数で次元数を表す。

int[][] arrayA;//2次元配列の宣言
int arrayB[][][];//3次元配列の宣言

また、多次元配列の場合は、大カッコを一度にまとめて記述する必要は無く、データ型と変数名の後ろに分けて記述することができる。

int[] arrayA[];//1+1で2次元配列の宣言
int[][] arrayB[];//2+1で3次元配列の宣言

配列インスタンスの生成方法

配列インスタンスの生成には以下の制約がある。

  • 配列インスタンスの生成には必ず要素数を指定すること。
  • 素数の指定はint型の整数値でなければならず、
    浮動小数点や、整数値であってもlong型は記述できないこと。
  • 多次元配列の場合は、変数の次元数と参照先の次元数が一致すること。

以下はコンパイルエラー

int[] arrayA = new int[];//要素数がないのでコンパイルエラー
int[] arrayB = new int[2.3];//浮動小数点を記述しているのでコンパイルエラー
int[][] arrayC = new int[]{};//次元数が一致してないのでコンパイルエラー。

1次元目の要素数は省略できない。が、2次元目の要素数を省略して別々のタイミングで生成することが可能。
データ型に書くは要素数を表し、変数に書くは添字を表す。

int[][] arrayA = new array[3][];//2次元目の要素数が無くても可。
array[0] = new int[3];
array[1] = new int[3];
array[2] = new int[3];

int[][] arrayB = new array[][3];//1次元目の要素数がない場合はコンパイルエラー。

配列インスタンスの生成と同時に要素の値を初期化したい場合は、初期化演算子{}を使う。

int[] arrayA = new int[] {10,20,30};//パターン1
int[] arrayB = {10,20,30};//パターン2

newと初期化演算子の両方を使った場合は、要素数を指定することはできない。
なぜなら初期化演算子の中に記述した値の数によって自動的に配列の要素数が決まるから 。
次のように記述するとコンパイルエラーとなる。

int[] array = new int[3] {10,20,30};//要素数を指定するとコンパイルエラー。
素数0の配列。

インスタンス的には何の意味も無いが、文法上間違っているわけではないのでコンパイルが通る。
以下の書き方はどれも同じ意味になる。

int[] arrayA = {};
int[] arrayC = new int[0];