Javaの配列とは?基本の使い方・宣言・初期化を初心者向けにわかりやすく解説
生徒
「先生、Javaで複数のデータをまとめて扱いたいんですが、どうすればいいですか?」
先生
「それなら配列を使うといいですよ。配列を使えば、同じ型のデータを効率的に管理できます。」
生徒
「配列って何ですか?どんなときに使うんですか?」
先生
「配列は、複数の値を一つの変数にまとめて格納できる仕組みです。例えば、クラスの生徒の点数を管理したり、曜日のデータを扱ったりするときに便利ですよ。それでは、詳しく見ていきましょう!」
1. Javaの配列とは?配列の基本概念
Javaの配列とは、同じデータ型の値を複数まとめて管理できる仕組みです。たくさんの値を一つひとつ別の変数で管理する代わりに、配列を使えば一つの変数で整理して扱えるようになります。
たとえば、生徒5人分のテストの点数を管理したい場合、配列を使わないと「score1」「score2」…のように変数を何個も用意する必要があります。しかし配列を使えば、点数を順番に並べてまとめて保存でき、後から一括で処理することも簡単になります。
配列には、次のような基本的な特徴があります。
- 同じデータ型の値だけをまとめて保存できる
- 配列を作成する時点で要素数(サイズ)が決まる
- 各要素には番号(インデックス)が割り当てられる
- インデックス番号は必ず0から始まる
インデックス番号を使うことで、「何番目のデータか」を指定して値を取り出したり変更したりできます。この考え方は、Javaだけでなく多くのプログラミング言語で共通です。
まずは「配列は、同じ種類のデータを順番に並べて入れておく箱のようなもの」とイメージすると理解しやすいでしょう。
public class ArrayBasicSample {
public static void main(String[] args) {
// 生徒3人分の点数をまとめて管理する配列
int[] scores = {80, 90, 75};
// 1人目の点数を表示(インデックスは0から始まる)
System.out.println("1人目の点数: " + scores[0]);
}
}
この例では、3人分の点数を一つの配列にまとめています。scores[0]と書くことで、最初の点数を取り出せる点が配列の基本です。
2. 配列の宣言方法を理解しよう
Javaで複数のデータをまとめて扱いたいときに使うのが「配列」です。配列を使うには、最初に「どんなデータを」「どの名前で」管理するのかを決めるために、配列の宣言を行います。宣言とは、これから配列を使いますよ、とJavaに伝えるための準備だと考えると分かりやすいです。
Javaの配列宣言には、次の2つの書き方があります。
どちらも意味は同じですが、「この変数は配列である」ことが一目で分かるため、実務や学習では方法1がよく使われます。初心者の方も、まずは方法1を覚えておけば問題ありません。
例えば、テストの点数や名前の一覧など、同じ種類のデータを複数まとめて扱う場面で配列はとても便利です。以下は、よく使われるデータ型の配列を宣言する基本例です。
public class ArrayDeclarationExample {
public static void main(String[] args) {
// 整数をまとめて管理するための配列
int[] scores;
// 名前などの文字列を入れる配列
String[] names;
// 小数を含む数値を扱う配列
double[] prices;
}
}
この時点では、配列の「箱」を用意しただけで、中身はまだ何も入っていません。そのため、宣言しただけでは配列は使えない点に注意が必要です。配列を実際に使うには、次のステップとして必ず初期化を行います。
3. 配列の初期化と要素へのアクセス方法
配列を宣言した後は、実際にメモリ領域を確保して使えるようにする必要があります。これを配列の初期化と呼びます。配列の初期化には、いくつかの方法があります。
new演算子を使った初期化
最も基本的な配列の初期化方法は、new演算子を使う方法です。この方法では、配列のサイズを指定してメモリ領域を確保します。
public class ArrayInitializationExample {
public static void main(String[] args) {
// 要素数5の整数型配列を作成
int[] scores = new int[5];
// 配列に値を代入
scores[0] = 85;
scores[1] = 92;
scores[2] = 78;
scores[3] = 88;
scores[4] = 95;
// 配列の要素を出力
System.out.println("1番目の点数: " + scores[0]);
System.out.println("2番目の点数: " + scores[1]);
System.out.println("5番目の点数: " + scores[4]);
}
}
このプログラムを実行すると、以下のような結果が得られます。
1番目の点数: 85
2番目の点数: 92
5番目の点数: 95
初期値を指定した初期化
配列の作成と同時に初期値を設定することもできます。この方法を使うと、配列のサイズを明示的に指定する必要がありません。
public class ArrayInitWithValuesExample {
public static void main(String[] args) {
// 初期値を指定して配列を作成
String[] fruits = {"りんご", "バナナ", "オレンジ", "ぶどう"};
// すべての要素を表示
for (int i = 0; i < fruits.length; i++) {
System.out.println((i + 1) + "番目の果物: " + fruits[i]);
}
}
}
このプログラムの実行結果は以下のようになります。
1番目の果物: りんご
2番目の果物: バナナ
3番目の果物: オレンジ
4番目の果物: ぶどう
配列の要素にアクセスする際は、インデックス番号を使います。インデックス番号は必ず0から始まることを覚えておきましょう。また、配列の長さはlengthプロパティで取得できます。
4. 配列のループ処理で全要素を操作する
配列のすべての要素を処理したい場合、ループ文を使うと効率的です。Javaでは、for文や拡張for文を使って配列の要素を順番に処理できます。
通常のfor文を使った処理
通常のfor文を使うと、インデックス番号を使って配列の要素にアクセスできます。この方法は、配列の要素を変更したい場合に便利です。
public class ArrayLoopExample {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};
// すべての要素を2倍にする
for (int i = 0; i < numbers.length; i++) {
numbers[i] = numbers[i] * 2;
}
// 結果を表示
System.out.println("配列の要素を2倍にした結果:");
for (int i = 0; i < numbers.length; i++) {
System.out.println("numbers[" + i + "] = " + numbers[i]);
}
}
}
実行結果は以下の通りです。
配列の要素を2倍にした結果:
numbers[0] = 20
numbers[1] = 40
numbers[2] = 60
numbers[3] = 80
numbers[4] = 100
拡張for文を使った処理
拡張for文は、配列のすべての要素を順番に処理する際に便利です。インデックス番号を意識せずに、シンプルなコードで配列の要素にアクセスできます。ただし、拡張for文では配列の要素を変更することはできません。
5. 多次元配列の基本と使い方
Javaでは、配列の中に配列を格納することができます。これを多次元配列と呼びます。最もよく使われるのは二次元配列で、表やマトリックスのようなデータ構造を表現するのに適しています。
二次元配列の宣言と初期化
二次元配列は、行と列を持つ表のようなデータ構造です。例えば、クラスの生徒の各科目の点数を管理するような場合に便利です。
public class TwoDimensionalArrayExample {
public static void main(String[] args) {
// 3人の生徒の3科目の点数を管理する二次元配列
int[][] scores = {
{85, 90, 78}, // 1人目の点数
{92, 88, 95}, // 2人目の点数
{76, 82, 89} // 3人目の点数
};
// すべての点数を表示
for (int i = 0; i < scores.length; i++) {
System.out.println((i + 1) + "人目の生徒の点数:");
for (int j = 0; j < scores[i].length; j++) {
System.out.println(" 科目" + (j + 1) + ": " + scores[i][j] + "点");
}
}
}
}
このプログラムの実行結果は以下のようになります。
1人目の生徒の点数:
科目1: 85点
科目2: 90点
科目3: 78点
2人目の生徒の点数:
科目1: 92点
科目2: 88点
科目3: 95点
3人目の生徒の点数:
科目1: 76点
科目2: 82点
科目3: 89点
二次元配列では、最初のインデックスが行を、次のインデックスが列を表します。ネストしたfor文を使うことで、すべての要素に順番にアクセスできます。
不規則な多次元配列
Javaの多次元配列は、各行の要素数が異なる不規則な配列を作成することもできます。これは、行ごとに必要なデータ量が異なる場合に便利です。
6. 配列の注意点とよくあるエラー
配列を使う際には、いくつかの注意点があります。特に初心者の方がよく遭遇するエラーについて理解しておくことが重要です。
ArrayIndexOutOfBoundsException
配列の範囲外のインデックスにアクセスしようとすると、ArrayIndexOutOfBoundsExceptionというエラーが発生します。これは、配列を扱う際に最もよく発生するエラーの一つです。
NullPointerException
配列を宣言しただけで初期化していない状態で使おうとすると、NullPointerExceptionが発生します。配列を使う前には、必ずnew演算子で初期化するか、初期値を設定する必要があります。
7. 配列の実践的な活用例
ここでは、配列を使った実践的なプログラムの例を見てみましょう。配列を使うことで、複雑なデータ処理も効率的に行えます。
配列の合計値と平均値を計算する
配列に格納された数値の合計値や平均値を計算するプログラムは、実務でもよく使われます。
public class ArrayCalculationExample {
public static void main(String[] args) {
int[] testScores = {85, 92, 78, 88, 95, 82, 90};
// 合計値を計算
int sum = 0;
for (int score : testScores) {
sum += score;
}
// 平均値を計算
double average = (double) sum / testScores.length;
// 結果を表示
System.out.println("テストの点数一覧:");
for (int i = 0; i < testScores.length; i++) {
System.out.println(" " + (i + 1) + "回目: " + testScores[i] + "点");
}
System.out.println("合計点: " + sum + "点");
System.out.println("平均点: " + average + "点");
}
}
実行結果は以下のようになります。
テストの点数一覧:
1回目: 85点
2回目: 92点
3回目: 78点
4回目: 88点
5回目: 95点
6回目: 82点
7回目: 90点
合計点: 610点
平均点: 87.14285714285714点
このように、配列とループ文を組み合わせることで、データの集計や統計処理を簡単に実装できます。配列は、大量のデータを効率的に処理するための基本的なツールとして、あらゆるプログラムで活用されています。
8. 配列のコピーと参照の違い
Javaで配列を扱う際に理解しておくべき重要な概念として、配列のコピーと参照の違いがあります。配列は参照型のデータ型であるため、単純な代入では配列の内容がコピーされるのではなく、参照がコピーされます。
配列の参照
配列変数には、配列そのものではなく、配列が格納されているメモリ上の位置を示す参照が保存されています。そのため、ある配列を別の変数に代入しても、両方の変数は同じ配列を参照することになります。
配列の実際のコピー
配列の内容を実際にコピーしたい場合は、System.arraycopyメソッドやArrays.copyOfメソッドを使用します。これにより、元の配列とは独立した新しい配列が作成されます。
9. 配列の検索と並び替え
配列内の特定の要素を探したり、配列の要素を並び替えたりする処理は、プログラミングでよく行われる操作です。Javaでは、Arraysクラスが提供する便利なメソッドを使って、これらの処理を簡単に実装できます。
配列の並び替え
Arrays.sortメソッドを使うと、配列の要素を昇順に並び替えることができます。数値の配列だけでなく、文字列の配列も並び替えることができます。並び替えを行うと、元の配列の要素の順序が変更されるため注意が必要です。
配列内の要素の検索
配列内に特定の要素が存在するかどうかを確認したい場合は、ループを使って順番に要素を確認する方法があります。また、配列がソート済みの場合は、Arrays.binarySearchメソッドを使って効率的に検索することもできます。
10. 配列を使う際のベストプラクティス
配列を効果的に使うためには、いくつかのベストプラクティスを知っておくと便利です。これらの知識は、より読みやすく、保守しやすいコードを書くために役立ちます。
配列サイズの適切な管理
配列を作成する際は、必要なサイズを正確に見積もることが重要です。配列のサイズは後から変更できないため、大きすぎるとメモリの無駄遣いになり、小さすぎるとArrayIndexOutOfBoundsExceptionが発生する原因となります。要素数が変動する可能性がある場合は、ArrayListなどの可変長のコレクションクラスの使用を検討しましょう。
lengthプロパティの活用
配列の長さをハードコーディングするのではなく、必ずlengthプロパティを使用しましょう。これにより、配列のサイズが変更された場合でも、コードを修正する必要がなくなります。また、配列の範囲外アクセスのエラーも防ぐことができます。
適切なループの選択
配列の要素を処理する際は、用途に応じて適切なループを選択しましょう。単に要素を読み取るだけなら拡張for文が簡潔で読みやすくなります。一方、インデックス番号が必要な場合や要素を変更する場合は、通常のfor文を使用します。
配列を使いこなすためのヒント
- 配列の要素にアクセスする前に、必ずインデックスが範囲内にあることを確認する
- 配列を引数として渡す際は、参照が渡されることを理解しておく
- 大量のデータを扱う場合は、配列よりもコレクションクラスの使用を検討する
- 多次元配列は構造が複雑になりやすいため、適切にコメントを書く
配列はJavaプログラミングの基礎となる重要な概念です。配列の基本的な使い方をしっかりと理解することで、より複雑なデータ構造やアルゴリズムを学ぶ際の土台となります。最初は戸惑うこともあるかもしれませんが、繰り返し練習することで自然に使いこなせるようになります。実際に自分でコードを書いて、配列の動作を確認しながら学習を進めていきましょう。