配列の概要と宣言の方法がわかれば、後は使いながら覚えて行くのがいいだろう。
このページではJavaの配列の基本的な使い方についてお伝えしよう。
目次
Javaの配列の基本的な使い方
使い方の前に
配列のイメージが湧いていない方はまず下記のページを確認してほしい。
配列を使うには宣言が必要だが、それは下記で詳しくお伝えしている。
基本的な使い方
配列の番号に応じて要素は取り出せる。
array[数字];
次のような形だ。
1 2 3 4 5 6 7 8 |
int ary[] = new int[5]; ary[0] = 4; ary[1] = 2; ary[2] = 1; ary[3] = 5; ary[4] = 3; System.out.println("インデックス0の値は" + ary[0] + "です"); |
入力するときは、
配列名[添字] = 値;
出力するときは、
配列名[添字]
を使えばいい。
例えば、上記のコードだと「インデックス0の値は4です」と表示される。
配列は「0」からはじまる。なので一つ目の要素はarray[0]などとなる。1ではないので気をつけよう。
配列への入力
上のようにひとつひとつ入れてもいいが、手間がかかりすぎるだろう。
次のようにすることもできる。
int[] ary = {4,2,1,5,3};
このように入力すると一括での利用も可能だ。
繰り返し処理との組み合わせ
配列を使った処理の代表的なものが繰り返し処理だ。以下の記述を見てほしい
1 2 3 4 |
int num[] = new int[100]; //① for(int index = 0 ; index < num.length; index ++){ //② num[index] = index ; //③ } |
まず、①ではint型の1長さ100の配列を生成している。
②は配列に対する繰り返し処理だが、
num.length
という記述で、配列の長さを取得する事が出来る。つまり、②のfor文は配列の長さ文だけ処理を繰り返すという事を意味している。
配列は変数が列になっているが、[]で数値を指定することで、その番号の要素を参照したり、値を代入したりすることが出来る。③は代入する場合の記述だ。
なお、再度のお伝えとなるが、配列の一番最初の要素は「0」(ゼロ)番から始まる。数え方として0,1,2となるので注意してもらいたい。
同じように、配列の長さ分処理を繰り返す処理として、以下のよう記述方法がある
1 2 3 4 |
int num[] = new int[100]; for( int element : num){ // ① System.out.println(element); } |
①の「int element : num」という記述は「numという配列の最初の要素から順に、int型変数のelementに代入する」という意味だ。
この記述方法は、PHPやperlなどで用いられるforeachと同じようなものだ。
Java1.6から採用された記述方法のため、それ以前から動いているプログラムでは見かけることはないが、最近のソースコードとしてはポピュラーな記述だ。
メソッドへの渡し方と参照型
ここからは少々難易度が高くなるので、ここまで理解しておけばまずは十分だ。
興味がある方だけ読んでみていただければと思う。
配列は変数の塊ということで、単一の変数とは少々扱いが異なる。まずは以下のソースコードを見てもらいたい
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
int num[] = new int[10]; for(int index = 0 ; index < num.length; index ++){ num[index] = index ; } change1(num); for( int element : num){ System.out.println(element); } System.out.println("****************"); change2(num); for( int element : num){ System.out.println(element); } System.out.println("****************"); } public void change1(int num[]){ int work = 0; for(int idx = 0 ; idx < num.length/2; idx ++){ work = num[idx] ; num[idx] = num[num.length - idx - 1]; num[num.length - idx - 1] = work; } } public void change2(int num[]){ int num2[] = new int[num.length] ; for(int idx = 0 ; idx < num.length; idx ++){ num2[num.length - idx - 1] = num[idx]; } num = num2 ; } |
change1()およびchange2()は、どちらも配列の数値の順番を逆転させている。
しかし、実際に実行してみるとわかるが、change1()は逆転させることが出来ているが、change2()は全く変わらない。どこに違いがあるのだろうか。
change1()は、変数numの各要素の値を直接書き換えている。
これに対し、change2()はnum2という新たな配列を用意してそこに逆順で値を代入し、最終的にnumにnum2を代入している。
入れ替えに失敗?
結果としてchaneg2()は配列の入れ替えに失敗しているが、これは何を意味しているのか。
配列変数は「参照型」と呼ばれるもので、実際の値を保持している訳では無い。
new演算子は、コンピューター上のメモリのどこかに変数の値を格納するための領域を確保する。
例えば、new int[10]は、int変数の値を格納するための4バイトの領域を10個、メモリ上のどこかに確保する。
そしてその格納した「場所」をnew演算子は返却する。
つまり
int number[] = new int[10] ;
と記述したとき、左側の変数numberには、メモリ上のどこかに確保された4×10バイトのメモリの場所が格納される。
実際、System.out.println(number)を使用してnumber変数を表示してみると、何やら暗号のような文字列が表示される。これがメモリの場所を意味している値と考えれば良い。
この「メモリの場所」を扱う変数を「参照型」という。
先のプログラムの例では、chaneg1()chaneg2()メソッドに対し配列の値を格納している「場所」を渡している。
change1()メソッドでは、その「場所」に格納されている値を変更しているのに対し、change2()メソッドでは、num変数にnum2を代入しているため、change2()メソッド内の変数numが保持している「場所」を書き換えただけで、呼び出し元のnumには影響が無い。
少しわかりにくいかも知れないが、変数の中身を書き換えるのと、変数そのものを別のものに替えるのとの違いだと思えば良いだろう。
他の参照型の例
配列の他、オブジェクト型の変数も参照型だ。例えば
1 2 3 |
public void change3(String str){ str = "メッセージ"; } |
というメソッドを呼び出しても、呼び出し側の変数に変化が無いのは試してみるとすぐにわかるだろう。
配列はひとかたまりでオブジェクト型と考えることも可能だ。
ただ、注意してもらいたいのは、change1()のように引数で受け取った配列変数の中身を書き換える処理は決して良い記述方法では無いという点だ。
多くの場合、プログラムの作り方を工夫すれば、このような記述をせずに済むはずだ。
また、chang3()メソッドのように、引数として宣言された変数に対し、メソッド内で代入するような記述は極力避けるべきであろう。
構文上禁止されている訳では無いが、一般的には嫌われる記述と理解しておこう。
まとめ
このページではJava配列の基本的な使い方についてお伝えをしてきた。
まずは基本的な使い方を覚えて、繰り返し文と組み合わせられるところまで理解しておこう。
最初のコードの6行目
ary[4]に値を代入することはできないです
ご指摘いただきありがとうございます。
修正させて頂きました。
引き続きご愛読の程宜しくお願いいたします。