配列
配列は同じデータ型の要素データを指定個数集めて一つの配列変数として扱えるようにしたものです。
複数の要素データを一つのまとまりとして扱う方法は配列以外にもいくつかありますが、配列の特徴は
配列の作成は3段階に分かれていますが、記述の仕方で一度にすべて行うことも出来ますが、基本は次の順で行わなければいけません。
配列の宣言
要素データの型 次元を表す[ ]のセット 配列要素名;
ですが、Javaの変数宣言に類似した語順である形式1とC言語などの変数宣言に類似した形式2の2種類の表記法があります。
形式1表記 int[] array;
形式2表記 int array[];
多次元配列は[ ]の数で次元を指定します。
多次元配列の宣言でも形式1表記、形式2表記が選択できます。
int[ ][ ] arrayA; 2次元配列型変数の宣言 int arrayB[ ][ ][ ]; 3次元配列型変数の宣言
なお形式1表記、形式2表記を併用しても構いません。つまり、[ ]を一度にまとめて記述する必要はありません。
int[] arrayA[]; int[][] arrayB[];
配列の宣言時には値がnullの配列型変数を確保するだけで、配列用の領域確保は行いません。従って、配列宣言の段階で[ ]内に数字を書き込み配列要素の数を指定するとコンパイルエラーになります。
配列の領域割当て
new演算子を使い、int型の値またはint 型の値を返す式により要素の数を指定して配列用の領域を確保します。
array = new int[要素の数];
なお、配列の宣言と領域の割当てを同時に行うことは可能です。。
int[] array = new int[3];
また、配列の宣言と領域の割当てを同時に行う場合に限り、new演算子による領域確保の代わりに、配列初期化子を使った初期化によって直接配列用の領域を確保することもできます。
int[] array = { 1, 2, 3 };
配列初期化子には、リテラル値のほか式も指定できるので、配列要素としてインスタンス生成式を記述しオブジェクトの参照を配列に格納することもできます。
なお、処理の途中で配列変数に配列初期化子で値を代入するとコンパイルエラーになります。しかし、new演算子を使った領域割り当てと同時であれば文中でも配列初期化子による値の代入は可能です。ただし、配列初期化子で要素の数を指定しているので、大カッコの中に要素数を指定するとコンパイルエラーになります。
多次元配列では全ての次元の配列インスタンスを一度に作成する必要はありません。例えば2次元配列では、まず1次元目の配列インスタンスを生成し、2次元目の配列インスタンスはあとから生成し、1次元目の配列の要素に2次元目の配列インスタンスへの参照を代入します。
また、多次元配列の要素を管理するための変数(一次元目の配列インスタンスの要素)は参照先の配列インスタンスの要素数とは無関係なので、2次元目以降の配列の要素数が全て同じである必要もありません。
および、段階的な二次元配列の作成
public class InitializationSpecifier { public static void main(String args[]) { int[] array1 = {1, 2, 3}; int array2[]; array2 = new int[]{10, 20, 30}; int array3[][]= {array1, array2}; System.out.print("array1:"); for(int ent1: array1) System.out.print(ent1 + " "); System.out.println(); System.out.print("array2:"); for(int ent2: array2) System.out.print(ent2 + " "); System.out.println(); System.out.print("array3:"); for(int[] arr: array3) { for(int ent: arr) System.out.print(ent + " "); } } }
実行結果
拡張for文による2次元配列からの要素取得法
>java InitializationSpecifier array1:1 2 3 array2:10 20 30 array3:1 2 3 10 20 30 >
配列要素の設定
配列インスタンスを作成した時に配列要素に設定されるデフォルト値は作る配列の型によって異なります。
特にchar型とString型(オブジェクト型)はデフォルト初期値が異なるので注意が必要です。
char型のデフォルト初期値は文字コード\u0000(印字は半角スペース)従って、char型の配列を宣言した場合に取られる要素のデフォルト初期値も\u0000、これに対しString型の配列を宣言した場合に取られる要素のデフォルト初期値はnullです。
配列インスタンスと要素は別物であるため、オブジェクト型配列は注意が必要です。
つまりオブジェクト型配列を作成しただけではオブジェクト型要素の初期値はnullですから、要素に特定のインスタンスを代入せずにオブジェクト型要素のフィールド値を参照すると、実行時に参照先がないという意味のNullPointerExceptionが発生します。
public class InitValue { public static void main(String args[]) { char[] charArray = new char[3]; System.out.print("charArry:["); for(char charEnt : charArray) { System.out.print(charEnt); } System.out.println("]"); String[] strArray = new String[3]; System.out.print("strArry:["); for(String strEnt : strArray) { System.out.print(strEnt); } System.out.println("]"); } }
実行結果
>java InitValue charArry:[ ] strArry:[nullnullnull] >
char型の配列ではデフォルト初期値\u0000が半角スペースで表示され、String型配列では初期値のnullを文字として表示します。
(printlnメソッドがnull値を文字として扱う仕様です。)