オブジェクト型配列
配列とは同じ型の変数をまとめて格納する事ができるデータ構造で、C言語をはじめとするほとんどの言語でサポートしています。
JavaでもC言語と同じように配列を扱うことができますが、Javaの配列はC言語の配列とは仕組みが異なる為、充分に注意する必要があります。
配列の宣言
Javaではプリミティブ型(基本型)以外のデータ(値)は、全てクラスのインスタンスとして表されました。
これは配列の場合も同じであり、配列型というクラスのインスタンスを生成する事になります。
したがって、配列型変数を宣言する場合にも配列型という型を宣言する必要があります。
配列型変数は、クラス名の後ろに[](ブランケット)を使い表現されます。
// String型配列 String[] strings = null; // Book型配列 Book[] books = null; // Object型配列 Object[] objects = null;
クラス名の後ろに[]をつける事で、〜型配列という型が宣言されました。
配列であっても参照型変数である事には変わらない為、宣言だけではインスタンス(値)はヒープに作成されません。
配列の初期化
配列の初期化とは配列のインスタンスを生成する事です。
したがって、他のクラスのインスタンスを生成する時と同じようにnew演算子を用います。
しかし、次のような書き方はできません。
new String[]();
この書き方は、Java言語として解釈したならば自然な形かもしれませんが、C言語などでは配列を初期化するには次のような書き方になります。
int nums[10];
Javaでの配列とC言語での配列とは内部的には大きく異なります。
しかし、Javaが開発された頃の方針として「C言語の記述方法をなるべく取り入れる」事がありました(C言語から移行する敷居を低くしたい)。
そこで、なるべくC言語に近い記述ということで、配列の初期化(インスタンスの生成)時に[]の中に配列のサイズを指定し、後ろの括弧を省略します。
// String型配列の初期化 String[] strings = new String[10]; // Book型配列の初期化 Book[] books = new Book[5]; // Object型配列の初期化 Object[] objects = new Object[30];
このように配列のインスタンスがヒープに確保される事が配列の初期化です。
配列の添え字
配列は複数の要素を持つデータ構造で、それぞれインデックスが振ってあります。
インデックスは0から始まる為、最後の要素のインデックスは「配列のサイズ − 1」になることを忘れないようにしてください。
配列の各要素にはインデックスを添え字にする事でアクセスする事ができます。
すなわち、stringsの0番目の要素であればstrings[0]、5番目の要素であればstrings[5]となります。
要素の初期値
配列を初期化(インスタンスを生成)した時、各要素にはどんな値も入っていません。
何故ならば、各要素はnew演算子を使ってインスタンスを生成していないからです。
一般的なクラスのインスタンス変数は、プリミティブ型の場合はそのインスタンスの中にメモリ領域が確保されましたが、参照型の場合は参照型変数のみがインスタンスの中に確保されます。
その実体(インスタンス)は初期化されることで初めてヒープの異なる領域に確保されました。
これと同じように配列クラスのインスタンスの正体は参照型変数の集合であり、配列が初期化されただけでは何も参照していないのです。
すなわち、配列が初期化された時点では配列の各要素はnullである為、それぞれインスタンスを生成しなければなりません。
配列の各要素は通常の参照型変数と同じように扱うことができます。
すなわち、代入・参照・メソッドの使用などが行えます。
strings[0] = "Hello"; strings[1] = " "; strings[2] = "World"; strings[4] = " "; System.out.println(string[0]); System.out.println(string[0].length());
配列のサイズ
配列のサイズを取得したい場合は、lengthで調べることができます。
String[] strings = new String[10]; // 配列のサイズ int size = strings.length;
lengthは配列クラスに定義されているpublicなクラス変数と考えることができます。
この変数には配列のサイズが格納されていますが、変更することができません。