1次元配列
配列と要素
Java言語にも当然、配列の概念があります
配列はひとつの変数名に対して構造的に複数のデータを格納することができます
配列を作成するには、まず配列名とデータ型を指定します
type ary-name[];
typeにはデータ型を、ary-nameに配列名を指定します
次に配列の領域(大きさ)を指定します。このときメモリの割り当てにnew演算子を用います
new演算子は、配列や後に説明するインスタンスの生成に使用する演算子です
ary-name = new type[size];
typeには、やはりデータ型を指定します。互換性のない変換不能な型を指定するとエラーがでます
sizeは、配列の要素数を指定します
要素数は0から数えられるので、要素を指定する添字はsizeの-1までの数になります
ary = new type[5]
この場合は
ary[0]
ary[1]
ary[2]
ary[3]
ary[4]
以上、5個の要素が作成されることになります
配列名と要素番号(添字)を指定することによって、配列にアクセスすることができます
あとは普通の変数同様に、代入、参照をおこなうことができます
class test {
public static void main(String args[]) {
int ary[];
ary = new int[5];
ary[0] = 10;
ary[1] = 20;
ary[2] = 30;
ary[3] = 40;
ary[4] = 50;
System.out.println("配列0番の内容 = " + ary[0]);
System.out.println("配列1番の内容 = " + ary[1]);
System.out.println("配列2番の内容 = " + ary[2]);
System.out.println("配列3番の内容 = " + ary[3]);
System.out.println("配列4番の内容 = " + ary[4]);
}
}
配列変数aryを作成し、要素を5つまでメモリに割り当てています
aryの各要素に数を代入して、最後にprintlnメソッドで各要素を出力しています
配列要素の作成は、次のように一行にまとめることができます
type ary-name = new type[size];
これをふまえて、先ほどのプログラムを書き直すと以下のようになります
class test {
public static void main(String args[]) {
int ary[] = new int[5];
ary[0] = 10;
ary[1] = 20;
ary[2] = 30;
ary[3] = 40;
ary[4] = 50;
System.out.println("配列0番の内容 = " + ary[0]);
System.out.println("配列1番の内容 = " + ary[1]);
System.out.println("配列2番の内容 = " + ary[2]);
System.out.println("配列3番の内容 = " + ary[3]);
System.out.println("配列4番の内容 = " + ary[4]);
}
}
配列を扱う時は、要素が0番から始まるということに注意してください
プログラムの実行時にありえない要素に参照が行なわれた場合は例外が発生します
これは、コンパイル時にエラーが出ないので注意してください
配列要素の数を取得するには次のような式を用います
ary-name.length
ary-nameは配列名を指定します
これを使って、現在の配列の要素数(サイズ)を知ることができます
class test {
public static void main(String args[]) {
int ary[] = new int[5];
ary[0] = 10;
ary[1] = 20;
ary[2] = 30;
ary[3] = 40;
ary[4] = 50;
System.out.println("配列要素のサイズ = " + ary.length);
}
}
配列の初期化
先ほどまでは、new演算子を用いて配列を作成したあとに
それぞれの要素に値を代入して初期化していました
しかし、{ } を用いることでC言語などと同様に宣言と同時に初期化することができます
type ary-name[] = { e0,e1,en...};
typeにはデータ型を、ary-nameに配列名を指定して配列を作成します
同時に { } で囲まれた値を左から順に要素番号0番から代入します
各要素はカンマ 「 , 」で区切ります。サイズは代入されたよう素数の数だけ自動的に割り当てられます
class test {
public static void main(String args[]) {
int ary[] = {10,20,30,40,50};
System.out.println("配列要素のサイズ = "+ ary.length);
System.out.println("配列0番の内容 = " + ary[0]);
System.out.println("配列1番の内容 = " + ary[1]);
System.out.println("配列2番の内容 = " + ary[2]);
System.out.println("配列3番の内容 = " + ary[3]);
System.out.println("配列4番の内容 = " + ary[4]);
}
}
さらに配列は、配列に配列を代入することでコピーを作ることもできます
class test {
public static void main(String args[]) {
int ary[] = {10,20,30,40,50};
int ary_copy[] = ary;
System.out.println("配列要素のサイズ = " + ary_copy.length);
System.out.println("配列0番の内容 = " + ary_copy[0]);
System.out.println("配列1番の内容 = " + ary_copy[1]);
System.out.println("配列2番の内容 = " + ary_copy[2]);
System.out.println("配列3番の内容 = " + ary_copy[3]);
System.out.println("配列4番の内容 = " + ary_copy[4]);
}
}
配列ary_copyに配列aryを代入していることがわかると思います
ただしこれは、物理的代入(複製)ではありません
aryの各要素が割り当てられているメモリの領域を参照しています
つまり、ary_copyはaryと同じデータを参照していることになります。以下のプログラムで証明しましょう
class test {
public static void main(String args[]) {
int ary[] = {10,20};
int ary_copy[] = ary;
ary_copy[0] = 100;
ary_copy[1] = 200;
System.out.println("ary[0]の内容 = " + ary[0]);
System.out.println("ary[1]の内容 = " + ary[1]);
}
}
ary_copyにaryを代入します
そしてary_copyの各要素に別の値を代入します
この場合、物理的な代入(複製)であればaryの値はそのままのはずです
しかしary_copyはaryと同じデータを参照しているので結果的にaryの値も変わります
これは、メモリの同じ領域を参照しているので当然のことですね