配列って何者か(「同じ型の箱」を並べたもの)
配列は「同じ型の値を、決まった個数だけ並べて持つための箱」です。 Java では「固定長データ」を扱うときの基本的なデータ構造で、int[] や String[] のように書きます。 「何個あるか」が最初に決まり、その後は増えも減りもしない——この“固定長”という性質が、配列の一番の特徴です。
int[] scores = new int[3]; // 要素数3の int 配列
scores[0] = 80;
scores[1] = 90;
scores[2] = 75;
Javaインデックスは 0 から始まり、最後の要素は length - 1 番目です。 ここをきちんと押さえておくと、配列でつまずきにくくなります。
一次元配列(横一列に並んだデータ)
一次元配列の基本操作
一次元配列は「横一列に並んだ値の列」です。 宣言・代入・参照の流れを具体的に見てみましょう。
int[] scores = {80, 90, 75}; // 初期値付き宣言
System.out.println(scores[0]); // 80
System.out.println(scores[1]); // 90
System.out.println(scores[2]); // 75
System.out.println("要素数 = " + scores.length); // 3
Java重要なのは次の2点です。
1つ目は「インデックスは 0 〜 length - 1」という範囲であること。 2つ目は「length プロパティで要素数を必ず確認する」こと。
これを守らないと、存在しないインデックスにアクセスして ArrayIndexOutOfBoundsException が発生します。
// NG例
System.out.println(scores[3]); // 要素数3なのに index=3 を読む → 例外
Java「配列は 0 始まり」「上限は < length」をセットで覚えておくのが、初心者にとって一番大事なポイントです。
ループとの組み合わせ(固定長データ処理の基本形)
配列は「全要素を順番に処理する」場面でよく使われます。 for 文との組み合わせが、固定長データ処理の基本形です。
int[] scores = {80, 90, 75};
int sum = 0;
for (int i = 0; i < scores.length; i++) {
sum += scores[i];
}
System.out.println("合計 = " + sum); // 245
Javaここでは、
配列の外で集計用変数 sum を 0 で初期化する ループの中で scores[i] を1件ずつ足していく
というパターンになっています。 「固定長のデータを、最初から最後まで漏れなく処理する」というときに、この形が自然に出てくるようになると、配列を“使いこなしている”感覚に近づきます。
多次元配列(二次元配列)で「表」を表現する
二次元配列のイメージ
二次元配列は「配列の配列」です。 イメージとしては「行と列を持つ表(テーブル)」だと思うと分かりやすいです。
int[][] matrix = {
{1, 2, 3}, // 0行目
{4, 5, 6}, // 1行目
{7, 8, 9} // 2行目
};
System.out.println(matrix[0][0]); // 1
System.out.println(matrix[1][2]); // 6
System.out.println(matrix[2][1]); // 8
Javamatrix[行][列] という形でアクセスします。 「行ごとに配列を持っていて、その中に列の値が並んでいる」という構造です。
二次元配列と入れ子のループ
二次元配列を全件処理するときは、入れ子の for 文を使います。
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int row = 0; row < matrix.length; row++) {
for (int col = 0; col < matrix[row].length; col++) {
System.out.print(matrix[row][col] + " ");
}
System.out.println();
}
Javaここで重要なのは、
外側のループは「行」を回す(row < matrix.length) 内側のループは「その行の列」を回す(col < matrix[row].length)
という構造になっていることです。 「配列の配列」なので、行ごとに列数が違うこともありえます。そのため、内側のループでは必ず matrix[row].length を使うのが安全です。
配列が「固定長」であることの意味
要素数は後から変えられない
配列は「作ったときに決めた要素数」がずっと変わりません。 途中で「やっぱり5個に増やしたい」と思っても、その配列自体の長さは変えられません。
int[] scores = new int[3];
// scores.length = 5; // こんなことはできない
Javaもし「もっと要素を増やしたい」なら、新しい配列を作って、古い配列から値をコピーする必要があります。
int[] oldScores = {80, 90, 75};
int[] newScores = new int[5];
for (int i = 0; i < oldScores.length; i++) {
newScores[i] = oldScores[i];
}
newScores[3] = 60;
newScores[4] = 70;
Javaこの「固定長」という性質があるからこそ、配列は「サイズが決まっているデータ」を扱うときに向いています。 逆に「増えたり減ったりするデータ」を扱いたいときは、List のような可変長コレクションを選ぶ方が自然です。
固定長データ処理の典型例
固定長データの例としては、
1週間分の売上(7日分) 1年分の月別データ(12ヶ月分) テストの科目数が決まっている点数配列
などがあります。
int[] monthlySales = new int[12]; // 12ヶ月分の売上
monthlySales[0] = 100; // 1月
monthlySales[1] = 120; // 2月
// ...
Java「必ず12個ある」「必ず7個ある」といった前提があるなら、配列で持つとシンプルです。 その代わり、「何個あるか」が変わる可能性があるなら、最初から List を選んだ方が後で楽になります。
配列と他のコレクションの関係を意識する
配列は「素朴で速い」けれど柔軟性は低い
配列は言語レベルの基本機能なので、アクセスが速く、オーバーヘッドも少ないです。 ただし、「サイズが固定」「便利メソッドが少ない」という意味では、柔軟性は低めです。
一方、List や Map などのコレクションは、「サイズ可変」「豊富なメソッド」「ジェネリクスで型安全」といった利点がありますが、 内部で配列を使っていることが多く、その分のオーバーヘッドがあります。
初心者のうちは、
サイズが決まっていて、単純な処理だけなら配列 サイズが変わる、便利メソッドを使いたいなら List
くらいのざっくりした使い分けで十分です。 「このデータは固定長か?」「増えたり減ったりするか?」を自分に問いかけて、配列かコレクションかを選ぶ癖をつけると、設計の感覚が育っていきます。
まとめと小さな練習
配列は「同じ型の値を、決まった個数だけ並べて持つ」ための基本的な器で、 一次元配列は横一列の並び、二次元配列は行と列を持つ表のような構造です。 インデックスは 0 始まり、範囲は 0 〜 length - 1、サイズは固定——この3つをしっかり体に入れておくことが、配列を安全に使うための土台になります。
練習として、
一次元配列で「テストの点数3科目分」を持ち、合計と平均を計算する 二次元配列で「3×3の表」を作り、全要素を表示する
といったコードを自分で書いてみると、固定長データ処理の感覚がぐっと掴みやすくなるはずです。
