皆さんこんにちは、TaroTechです。
今回は「Javaにおける配列」についてイラストやサンプルコードを用いながら分かりやすく解説していきます。
配列は複数の値をまとめて格納できる便利な文法になるので是非内容を理解して使いこなせるようになりましょう。
1.配列とは
複数のデータをひとまとめにして管理できる文法(技術)を配列と呼びます。
名前の通りイメージとしては各データが順番にまとめて整頓されているようなイメージになります。
配列における個々のデータのことを配列の要素と呼び、要素は順番に添え字という番号で管理されます。
Javaの場合、配列の添え字は0から始まります。
また、同じ配列の中で扱うデータの型はすべて同じ型でなければなりません。
2.配列の構文と使い方
配列を使うには「配列を表す変数の宣言」と「配列オブジェクトの生成」を行います。
構文1
//配列を表す変数の宣言
データ型 変数名[];
または
データ型[] 変数名;
//配列オブジェクトの生成
変数名 = new データ型[要素数]
配列を扱うときは上記のように記述します。
構文にも書いてあるように、newキーワードを使用して後ろに配列として扱いたいデータ型と要素数を[]で囲むことによって配列オブジェクトが生成されます。
例
//要素数5のint型配列
int numbers[];
numbers = new int[5]
//要素数3のString型配列
String[] messages;
messages = new String[3];
構文1でも配列の宣言と生成は行えますが、1行で両方を記述することもできます。
構文2
//配列の変数宣言と生成を1行で表現
データ型 変数名[] = new データ型[要素数];
または
データ型[] 変数名 = new データ型[要素数];
例
//要素数5のint型配列
int numbers[] = new int[5];
//要素数3のString型配列
String[] messages = new String[3];
上記の構文1または構文2のように記述することで配列を生成することができました。
ただこのままでは配列の要素を指定していないため、中身が不明のままです。
配列の要素に値を指定する
配列を生成したら、次は要素にデータを指定します。
//配列を宣言・生成
データ型[] 変数名 = new データ型[要素数]
//要素にデータを指定
変数名[0] = 値;
変数名[1] = 値;
・
・
変数名[要素数-1] = 値;
例
//配列の宣言・生成
int[] numbers = new int[3]
//要素にデータを指定
numbers[0] = 0;
numbers[1] = 1;
numbers[2] = 2;
numbers[3] = 3; ← これはエラーになる
上記の例のように、配列の要素は配列の変数名[添え字] = 値で指定します。
ここで注意ポイントが一つあります。
例に示したコードの一番下の行のように添え字の最大数(要素数-1)を超えて要素を宣言すると、例外「java.lang.ArrayIndexOutOfBoundsException」が発生します。
例外とはプログラムの異常を通知する仕組みで、例外が発生するとプログラムが正常に動作せず強制終了してしまいます。
また、Javaでは配列の要素を指定しなかった場合は以下の表の値で初期化されるルールになっています。
要素の値を指定しなかったときの初期値
データ型 | 値 |
---|---|
byte、short、int、long(整数を扱うデータ型) | 0 |
char(1文字を扱うデータ型) | \u0000 |
float、double(実数を扱うデータ型) | 0.0 |
boolean | false |
参照型(Stringやユーザーが自由に決める型) | null |
ちなみに上記の表のうちの「null」とは参照先の値が不明という意味を表す用語になります。
newキーワードを使わずに要素のデータ宣言
上記のように配列を宣言・生成してから要素にデータを指定する記述の仕方は分かったと思います。
実はJavaではnewキーワードを指定しなくても要素の値を指定することができる記述法があるのでそれを紹介します。
newキーワードを使わない要素のデータ宣言
データ型[] 変数名 = {値, 値, 値, ・・・,値};
(要素数は値の数で自動的に決まる)
例
int numbers[] = {1, 2, 3, 4, 5};
String[] countries = {"日本", "アメリカ", "インド"};
例のようにnewキーワードを使用せずに{}内に値を記述しても配列を宣言・生成することができます。
なお、値は先頭から順番に添え字の[0]、[1]、[2]…と指定されていきます。
また、配列の要素数は{}内の値の個数と同じになります。
3.配列と繰り返し文
配列は複数のデータをまとめて扱えるという説明をしてきました。
このような特徴を持っていることから、繰り返し文と組み合わせることでコードの幅がより広がるという特徴も持ち合わせています。
3-1.配列とfor文
早速ですがサンプルコードを見てみましょう。
サンプルコード
public class Example1 {
public static void main(String[] args) {
// 配列の宣言・生成
int[] numbers = new int[5];
// for文と組み合わせて値を指定し表示
for (int i = 0; i < numbers.length; i++) {
numbers[i] = i;
System.out.println(numbers[i]);
}
}
}
まず要素数が5のint型配列を宣言・生成しています。
次にfor文と組み合わせて先頭から順に値を指定し、そのまま続けて表示する処理を行っています。
ポイントは赤字で示した「numbers.length」の部分です。
「配列を表す変数.length」と記述することで配列の要素数(int型)を表すことができます。今回のサンプルコードだと5になります。
流れとしては、
i = 0 → numbers[0]に0を代入、numbers[0]の値を表示
i++;
i = 1 → numbers[1]に1を代入、numbers[1]の値を表示
i++;
・
・
i = 4 → numbers[4]に4を代入、numbers[4]の値を表示
i++;
継続条件は「i < 5(配列の要素数)」でi = 5になるので処理終了
となります。
3-2.配列と拡張for文
for文では継続条件にパラメーターを用いて繰り返しの制御を行いましたが、今から紹介する拡張for文はパラーメーターを用いることなく配列の値を参照することができます。
構文
for(配列の型 変数 : 配列を表す変数){
//処理
}
サンプルコード
public class Example2 {
public static void main(String[] args) {
// 配列の宣言・生成
int[] numbers = new int[5];
//値の指定
numbers[0] = 0;
numbers[1] = 1;
numbers[2] = 2;
numbers[3] = 3;
numbers[4] = 4;
// 拡張for文と組み合わせて値を表示
for (int number: numbers) {
System.out.println(number);
}
}
}
コードの赤字で示した部分が拡張for文になります。
今回のコードの場合、配列の型は「int型」で変数名は「numbers」となっています。
なので拡張for文ではint型の「number」という新しい変数を指定し、「:(コロン)」で区切って配列を表す「numbers」という変数名を記述します。
この記述をすることで、配列の0番目から(要素数-1)番目まで順番にnumberという変数に格納して表示するという処理が繰り返されます。
4.配列の仕組み
Javaにおいて配列はオブジェクトとして扱われます。
オブジェクトとは対象物を管理するための領域のことを指します。
配列が宣言された(生成された)タイミングで配列がどこの領域にあるかという情報や(アドレス)要素数などの情報が配列で管理されます。 配列を扱う場合はその配列が存在する場所を指し示す変数(参照型変数)を用いて扱います。
5.確認問題
Q1.配列を用いて以下の3つの言葉をすべて表示させよ。
(ウノ・ドス・トレス)
Q2.配列を用いてランダムに生成された0~50までの5つの整数の平均値を求めよ。
(配列に値を格納する処理と値を参照して合計していく処理を分けて考えてみよう)
public class Question2 {
public static void main(String[] args) {
int[] numbers = new int[5];
double total = 0;
//処理を記述
System.out.println("平均値は" + average);
}
}
tips
・0~50までの整数をランダムに生成:(int)(Math.random() * 51);
→Math.random()は0以上1未満の実数をランダムに生成する便利なメソッドです。返り値はdouble型になりますが、今回は便宜上int型にキャストして使用します。
・平均値はdouble型のaverageという変数で表現する
6.確認問題の解答
Q1
public class Question1 {
public static void main(String[] args) {
//配列の宣言と生成
String[] messages = new String[3];
//値の指定
messages[0] = "ウノ";
messages[1] = "ドス";
messages[2] = "トレス";
for(int i = 0;i < messages.length;i++) {
System.out.println(messages[i]);
}
}
}
Q2
public class Question2 {
public static void main(String[] args) {
int[] numbers = new int[5];
double total = 0;
// 先頭から順に配列に値を指定
for (int i = 0; i < numbers.length; i++) {
numbers[i] = (int) (Math.random() * 51);
System.out.println(numbers[i]);
}
// 拡張for文で先頭から値を合計していく
for (int number : numbers) {
total += number;
}
// 平均値の計算
double average = (total / numbers.length);
System.out.println("平均値は" + average);
}
}
コメント