Javaの学習を始めたばかりのころ、多くの人が「配列」という概念でつまずきがちです。
私自身、Javaを学び始めたとき、変数に1つの値しか入れられない世界から、急に複数の値を扱える配列が登場し、頭が混乱した経験があります。
しかし、現場で数多くのJavaコードに触れてきた今なら、断言できます。
配列をきちんと理解できるかどうかで、その後の上達スピードは大きく変わります。
この記事は、以下のような悩みを持つJava初心者の方に向けて書きました。
こんな方におすすめ
- そもそもJavaの配列が何なのかイメージできない
- 配列の基本的な使い方が分からない
for文と配列の組み合わせ方が知りたい
この記事を最後まで読めば、Javaの配列の基礎知識から、実践的な使い方を体系的に理解できます。
つまずきやすいポイントは、すべてコード例つきで解説します。
この記事は、Java入門ロードマップの「STEP2|基本文法」に対応しています。全体の学習順は次の記事で確認できます。
PARTS LIST /目次
Javaの配列とは?基本の仕組み
Javaプログラミングにおいて、配列は複数のデータを効率的に扱うための基本的な仕組みです。最初に、配列の概念と基本文法をしっかりと押さえましょう。
配列とは何か?変数との違い
配列とは、同じ型の複数のデータを、番号付きの箱に並べてまとめて格納する仕組みです。
たとえば、テストの点数を管理したい場合を考えてみましょう。変数の場合、生徒5人分の点数を保存するには、5個の変数が必要です。
int score1 = 80;
int score2 = 95;
int score3 = 70;
int score4 = 88;
int score5 = 92;
この書き方だと、生徒が100人になれば変数も100個必要で、とても管理しきれません。
配列を使えば、5人分の点数を1つのまとまりとして扱えます。
int[] scores = {80, 95, 70, 88, 92};
scoresという1つの名前で、5つの点数をまとめて管理できます。複数の値を1つの名前で扱える点が、変数との大きな違いです。
Javaで配列が必要になる理由
Javaで配列が必要になる最大の理由は、大量のデータを効率的に処理できるからです。
先ほどのテストの点数の例のように、たくさんのデータを扱いたい場面はプログラミングでは頻繁に登場します。
配列を使えば、繰り返し処理(for文など)と組み合わせることで、大量のデータに対する操作をわずか数行のコードで記述できます。
もし配列がなければ、データ1つひとつに対して同じ処理を何度も書く必要があり、コードが長くなるだけでなく、修正も大変でミスも発生しやすくなるでしょう。
配列の宣言と初期化の基本文法
Javaで配列を利用するには、まず「宣言」と「初期化」が必要です。
宣言は、「これからこの名前で、この型の配列を使いますよ」とコンピューターに伝える作業です。
// 構文: 型[] 配列名;
int[] scores; // int型の値を格納するscoresという名前の配列を宣言
String[] names; // String型の値を格納するnamesという名前の配列を宣言
初期化は、配列が実際にいくつのデータを格納できるのか、箱(要素)を確保する作業です。初期化には、大きく分けて2つの方法があります。
- 要素数を指定して初期化する方法
newキーワードを使い、配列のサイズ(要素数)を指定して作成します。
この場合、各要素はデータ型の初期値(intなら0、Stringならnull)で自動的に埋められます。
// 構文: 配列名 = new 型[要素数];
scores = new int[5]; // int型の要素を5つ格納できる配列を作成
もちろん、宣言と初期化は1行で書くことも可能です。
// 構文: 型[] 配列名 = new 型[要素数];
int[] scores = new int[5]; // 宣言と同時に5つの要素を持つ配列を初期化
- 初期値を指定して初期化する方法
// 構文: 型[] 配列名 = {値1, 値2, 値3, ...};
int[] scores = {80, 95, 70, 88, 92}; // 5つの初期値を持つ配列を作成
String[] names = {"田中", "佐藤", "鈴木"}; // 3つの初期値を持つ配列を作成
Javaの配列の使い方
配列の基本的な仕組みを理解したところで、次は具体的な使い方を見ていきましょう。ここでは、要素へのアクセス方法や、配列の長さを取得する方法を解説します。
配列の宣言と代入の書き方
配列の各データ(要素)には、インデックスと呼ばれる番号が割り振られています。このインデックスは0から始まることに注意してください。
たとえば、要素数が5の配列の場合、インデックスは0, 1, 2, 3, 4となります。
要素に値を代入するには、配列名[インデックス]の形式で場所を指定します。
// 5人分の点数を格納する配列を作成
int[] scores = new int[5];
// インデックスを使って各要素に値を代入する
scores[0] = 80; // 最初の要素(インデックス0)に80を代入
scores[1] = 95;
scores[2] = 70;
scores[3] = 88;
scores[4] = 92; // 最後の要素(インデックス4)に92を代入
ここでscores[5]のように、存在しないインデックスを指定すると、ArrayIndexOutOfBoundsExceptionというエラーが発生します。
ArrayIndexOutOfBoundsExceptionは初心者がよく遭遇するエラーなので、インデックスは0から始まり、最後のインデックスは「要素数 - 1」であることを必ず覚えておきましょう。
配列の要素を取得・変更する方法
配列の要素に格納された値を取得する場合も、代入と同じようにインデックスを使います。
int[] scores = {80, 95, 70, 88, 92};
// インデックスを指定して要素の値を取得し、出力する
System.out.println(scores[0]); // 実行結果: 80
System.out.println(scores[2]); // 実行結果: 70
// 取得した値を別の変数に代入することも可能
int tanakaScore = scores[0];
System.out.println("田中さんの点数は" + tanakaScore + "点です"); // 実行結果: 田中さんの点数は80点です
一度代入した要素の値を変更(上書き)することもできます。
int[] scores = {80, 95, 70, 88, 92};
System.out.println("変更前の3番目の点数: " + scores[2]); // 実行結果: 変更前の3番目の点数: 70
// インデックス2の要素の値を変更する
scores[2] = 75;
System.out.println("変更後の3番目の点数: " + scores[2]); // 実行結果: 変更後の3番目の点数: 75
配列の長さを取得する「length」フィールド
配列にいくつの要素が格納されているか(配列の長さ)を取得するには、lengthというフィールド(配列が持つ変数のようなもの)を使います。
lengthは、後述するfor文で配列を処理するときに欠かせません。
lengthはメソッドではないため、()(丸括弧)は付けずに配列名.lengthのように記述します。
int[] scores = {80, 95, 70, 88, 92};
String[] fruits = {"りんご", "バナナ", "みかん"};
// lengthフィールドで配列の長さを取得する
System.out.println(scores.length); // 実行結果: 5
System.out.println(fruits.length); // 実行結果: 3
配列を使った具体例
ここからは、配列をより実践的に使うための具体例を見ていきましょう。特にループ処理との組み合わせは、Java配列を扱う上での基本中の基本です。
for文を使った配列のループ処理
配列の全ての要素に対して同じ処理を行いたい場合、for文を使うのが一般的です。
for文のカウンタ変数(よくiが使われます)を配列のインデックスとして利用します。
配列名.lengthと組み合わせることで、配列の長さが変わってもコードを修正する必要がなくなります。
// 生徒5人分の点数配列
int[] scores = {80, 95, 70, 88, 92};
// for文を使って全ての要素を順番に出力する
// i < scores.length とすることで、iが0から4まで変化する
for (int i = 0; i < scores.length; i++) {
System.out.println((i + 1) + "番目の点数: " + scores[i]);
}
実行結果:
1番目の点数: 80
2番目の点数: 95
3番目の点数: 70
4番目の点数: 88
5番目の点数: 92
i = 00 < 5 → truescores[0] は 80i = 11 < 5 → truescores[1] は 95i = 22 < 5 → truescores[2] は 70i = 33 < 5 → truescores[3] は 88i = 44 < 5 → truescores[4] は 92i = 55 < 5 → false拡張for文(for-each)の使い方
配列の全ての要素に対して、順番に処理を行うだけであれば、よりシンプルに記述できる拡張for文(for-each文とも呼ばれます)が便利です。
拡張for文は、インデックスを意識する必要がないため、コードがすっきりと読みやすくなります。
// 構文: for (型 変数名 : 配列名) { ... }
int[] scores = {80, 95, 70, 88, 92};
// 拡張for文を使って全ての要素を順番に出力する
for (int score : scores) {
// scores配列から要素が1つずつ取り出され、score変数に代入される
System.out.println("点数: " + score);
}
実行結果:
点数: 80
点数: 95
点数: 70
点数: 88
点数: 92
ただし、拡張for文では要素のインデックス番号が分かりません。「何番目の要素か」を知りたいときや、ループ中に要素の値を変更したいときは、通常のfor文を使ってください。
配列を使った平均値や合計の計算例
配列とfor文を組み合わせることで、合計値や平均値の計算も簡単に行えます。
int[] sales = {120, 250, 180, 300, 210, 280, 150}; // 1週間の売上データ
int sum = 0; // 合計値を保存する変数
// 拡張for文で合計値を計算する
for (int sale : sales) {
sum += sale; // sum = sum + sale と同じ意味
}
// 平均値を計算する (合計 / 要素数)
// double型にキャストしないと、小数点以下が切り捨てられてしまうので注意
double average = (double)sum / sales.length;
System.out.println("合計売上: " + sum); // 実行結果: 合計売上: 1490
System.out.println("平均売上: " + average); // 実行結果: 平均売上: 212.857...
多次元配列を理解しよう
Javaの配列は、1列にデータが並んだ1次元配列だけでなく、行と列を持つ表のような多次元配列も作成できます。
多次元配列の宣言と初期化
2次元配列は、配列の中にさらに配列が入っている構造をしています。エクセルのシートや、碁盤の目をイメージすると分かりやすいでしょう。
宣言や初期化は、[]を2つ続けて記述します。
- 要素数を指定して初期化する方法
// 構文: 型[][] 配列名 = new 型[行数][列数];
// 3行2列のint型2次元配列を作成
int[][] matrix = new int[3][2];
- 初期値を指定して初期化する方法
// 構文: 型[][] 配列名 = {{1行目の値}, {2行目の値}, ...};
// 3教科、5人分の点数を管理する2次元配列
int[][] testScores = {
{80, 95, 70, 88, 92}, // 1行目: 国語の点数
{75, 89, 91, 82, 78}, // 2行目: 数学の点数
{88, 92, 85, 79, 95} // 3行目: 英語の点数
};
上のtestScoresを表にすると、1つ目の[]が行(教科)、2つ目の[]が列(何人目か)を指します。
testScores[0]{80, 95, 70, 88, 92}testScores[1]testScores[2]{88, 92, 85, 79, 95}↓ 1つの値を取り出すときは、添字を2つ指定する
ACCESS / 要素の指定
testScores[1]1[2]2
testScores.length = 行数 3 / testScores[i].length = 列数 5二重for文でのアクセス方法
2次元配列の全ての要素にアクセスするには、for文を2つ入れ子にした二重for文(ネストしたfor文)を使います。
外側のfor文で行を、内側のfor文で列を操作するのが一般的です。
int[][] testScores = {
{80, 95, 70, 88, 92},
{75, 89, 91, 82, 78},
{88, 92, 85, 79, 95}
};
// testScores.lengthで行数 (3) を取得
for (int i = 0; i < testScores.length; i++) {
// testScores[i].lengthで各行の列数 (5) を取得
for (int j = 0; j < testScores[i].length; j++) {
// System.out.print() は改行しない出力
System.out.print(testScores[i][j] + " ");
}
// 1行分の出力が終わったら改行する
System.out.println();
}
実行結果:
80 95 70 88 92
75 89 91 82 78
88 92 85 79 95
2次元配列の応用例(表データなど)
2次元配列は、さまざまな場面で活用できます。
- 座席表:
seats[2][4]で3行目の5番目の席の状態(空席か予約済みか)を管理する - ゲームのマップ:
map[10][10]でフィールドの各マスに地形やキャラクター情報を格納する - 画像データ: 各ピクセルの色情報を格納する
行と列で管理したいデータがある場合に、2次元配列は役立ちます。
配列と便利なクラス・メソッド
Javaには、配列操作を助けてくれる便利なクラスやメソッドが標準で用意されています。
並べ替えや検索を自分で書かずに済むため、コードが短く、ミスも減ります。
Arraysクラスでできること(並べ替え・検索など)
java.util.Arraysクラスは、配列を操作するための静的メソッドを提供します。
利用するには、ファイルの先頭でimport java.util.Arrays;と記述します。
sort():要素を昇順(小さい順)に並べ替えます。binarySearch():ソート済みの配列から、指定した値のインデックスを高速に探します。並べ替えていない配列では正しい結果になりません。equals():2つの配列の要素がすべて同じかどうかを比べます。
3つのメソッドを続けて使うと、次のようになります。
import java.util.Arrays;
int[] numbers = {50, 20, 80, 10, 40};
Arrays.sort(numbers); // numbersの中身は {10, 20, 40, 50, 80} に変わる
int index = Arrays.binarySearch(numbers, 40); // indexは 2(ソート済みの配列が前提)
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
boolean isEqual = Arrays.equals(a, b); // trueが返される
toString()で配列を文字列に変換する
配列変数をそのままSystem.out.println()で出力しようとすると、[I@...のような読めない文字列が表示されてしまいます。
表示されるのは「配列の型を表す記号([Iはint型の配列)@ハッシュコード(16進数)」で、配列の中身ではありません。
int[] numbers = {10, 20, 30};
System.out.println(numbers); // 実行結果の例: [I@1b6d3586
配列の中身を分かりやすく文字列として表示したい場合は、Arrays.toString()メソッドを使います。
import java.util.Arrays;
int[] numbers = {10, 20, 30};
System.out.println(Arrays.toString(numbers)); // 実行結果: [10, 20, 30]
arraycopy()で配列をコピーする方法
配列のコピーには注意が必要です。=を使って代入すると、配列そのものではなく、配列の場所情報(参照)だけがコピーされます。
import java.util.Arrays;
int[] original = {1, 2, 3};
int[] copy = original; // これは参照のコピー
copy[0] = 99; // コピーした配列の要素を変更すると...
System.out.println(Arrays.toString(original)); // 実行結果: [99, 2, 3]
// 元の配列まで変わってしまう!
配列の要素を丸ごと新しい別の配列にコピーしたい場合は、System.arraycopy()メソッドを使います。
import java.util.Arrays;
// 構文: System.arraycopy(コピー元, コピー元開始位置, コピー先, コピー先開始位置, コピーする要素数);
int[] original = {1, 2, 3, 4, 5};
int[] destination = new int[5];
System.arraycopy(original, 0, destination, 0, 5);
destination[0] = 99; // コピー先の配列を変更しても...
System.out.println("コピー元: " + Arrays.toString(original)); // 実行結果: コピー元: [1, 2, 3, 4, 5]
System.out.println("コピー先: " + Arrays.toString(destination)); // 実行結果: コピー先: [99, 2, 3, 4, 5]
// 元の配列は影響を受けない
配列の最大値・最小値を求める
配列の最大値・最小値は、Arrays.stream()(Java 8以降)でStreamに変換すると簡潔に求められます。使うのはmax()/min()メソッドです。
import java.util.Arrays;
int[] numbers = {50, 20, 80, 10, 40};
int max = Arrays.stream(numbers).max().getAsInt();
int min = Arrays.stream(numbers).min().getAsInt();
System.out.println("最大値: " + max); // 実行結果: 最大値: 80
System.out.println("最小値: " + min); // 実行結果: 最小値: 10
配列に要素を追加・削除する方法
Javaを学び始めると、多くの人が「配列に新しい要素を追加したい」と思う場面に出会います。
しかし、Javaの配列は作成時にサイズが固定され、後から要素数を変更することはできません。ここでは、要素の追加・削除を実現する2つの方法を解説します。
方法1: Arrays.copyOf()で新しい配列を作り直す
1つ目の方法は、元の配列より大きいサイズの新しい配列を作成し、中身をコピーしてから最後に新しい値を代入するやり方です。
Arrays.copyOf()メソッドを使うと簡潔に書けます。
import java.util.Arrays;
int[] original = {1, 2, 3};
// 元の配列より1つ大きいサイズの新しい配列を作成(中身は自動でコピーされる)
int[] added = Arrays.copyOf(original, original.length + 1);
// 末尾に新しい値を追加
added[added.length - 1] = 4;
System.out.println(Arrays.toString(added)); // 実行結果: [1, 2, 3, 4]
この方法は元の配列をそのまま使い続けたい場合に有効ですが、追加のたびに配列全体をコピーし直すため、頻繁に要素を追加する処理には向きません。
方法2: ArrayListに変換してadd()・remove()する
2つ目の方法は、配列をArrayListに変換してから操作する方法です。要素の追加・削除を頻繁に行う場合は、こちらが実務でも一般的です。
配列からArrayListへの変換にはArrays.asList()を使います。
ただし、Arrays.asList()が返すリストはサイズが固定されており、そのままではadd()できない点に注意が必要です。
new ArrayList<>(...)で包むことで、サイズ変更可能な通常のArrayListに変換できます。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
Integer[] original = {1, 2, 3};
// Arrays.asList()だけだと固定サイズなのでadd()できない
// List<Integer> fixedList = Arrays.asList(original);
// fixedList.add(4); // UnsupportedOperationExceptionが発生する
// new ArrayList<>()で包むとサイズ変更可能になる
List<Integer> list = new ArrayList<>(Arrays.asList(original));
list.add(4); // 末尾に要素を追加
list.remove(0); // インデックス0の要素を削除
System.out.println(list); // 実行結果: [2, 3, 4]
操作が終わって配列に戻したい場合は、ListのtoArray()メソッドを使います。Java 11以降はlist.toArray(Integer[]::new)とも書けます。
// ArrayListから配列へ変換する
Integer[] resultArray = list.toArray(new Integer[0]);
System.out.println(Arrays.toString(resultArray)); // 実行結果: [2, 3, 4]
頻繁に要素の追加・削除が発生する場面では、最初から配列ではなくArrayListでデータを管理するほうがシンプルで安全です。
2つの配列を結合する
2つの配列を1つに結合したい場合もArrays.copyOf()とSystem.arraycopy()を組み合わせて実現できます。
import java.util.Arrays;
int[] array1 = {1, 2, 3};
int[] array2 = {4, 5, 6};
// array1のサイズを2つ分足した長さにコピーし、そこにarray2を追記する
int[] combined = Arrays.copyOf(array1, array1.length + array2.length);
System.arraycopy(array2, 0, combined, array1.length, array2.length);
System.out.println(Arrays.toString(combined)); // 実行結果: [1, 2, 3, 4, 5, 6]
よくある質問
Q1. Javaの配列に後から要素を追加できますか?
A1. 配列は作成時にサイズが固定されるため、直接追加することはできません。Arrays.copyOf()で新しい配列を作り直すか、ArrayListに変換してadd()する方法があります。
Q2. 配列とArrayListの違いは何ですか?
A2. 配列はサイズが固定で変更できませんが、ArrayListは要素の追加・削除が自由にできます。頻繁にサイズが変わるデータを扱う場合はArrayListが向いています。
Q3. 配列のインデックスは何番から始まりますか?
A3. 0から始まります。要素数がnの配列の場合、最後のインデックスは「n-1」です。存在しないインデックスを指定するとArrayIndexOutOfBoundsExceptionが発生します。
Q4. 配列の長さはどうやって取得しますか?
A4. lengthフィールドを使います。lengthはメソッドではないため、配列名.length()ではなく配列名.lengthのように括弧なしで記述します。
Q5. 配列をコピーするときの注意点は何ですか?
A5. =で代入すると、配列の中身ではなく参照(場所情報)だけがコピーされます。コピー先を変更すると元の配列も変わってしまうため、中身を丸ごとコピーしたい場合はSystem.arraycopy()やArrays.copyOf()を使います。
Q6. 配列の中身を分かりやすく表示するにはどうすればいいですか?
A6. 配列をそのままSystem.out.println()すると[I@...のような読めない文字列(型を表す記号とハッシュコード)が表示されます。Arrays.toString()メソッドを使うと[1, 2, 3]のように見やすい形式で表示できます。
まとめ|配列の基本をマスターして次のステップへ
Javaの配列を、基本の考え方から実務での使い方まで見てきました。
配列のポイントおさらい
配列の要点を振り返ります。
- 配列は、同じ型のデータをまとめて管理するための仕組み。
- 各要素には0から始まるインデックスが割り振られる。
- 配列の長さは
配列名.lengthで取得できる。 for文や拡張for文と組み合わせることで、大量のデータを効率的に処理可能。- 2次元配列を使えば、表のようなデータも扱える。
Arraysクラスには、ソートや検索など便利なメソッドが用意されている。- 配列は固定長のため、要素の追加・削除には
ArrayListへの変換が実務では一般的。
| REV. | DATE | 内容 |
|---|---|---|
| 5 | 2026-10-16 | 図解を描き直し(図面のデザインにそろえた) |
| 4 | 2026-10-14 | まとめの言い回しを見直し。雰囲気だけの挿絵を外し、図解に置き換え |
| 3 | 2026-10-04 | 記載内容の事実確認と修正 |
| 2 | 2026-09-04 | 2026年9月時点の情報で全体を見直し |
| 1 | 2025-10-29 | 初版 |
](/wp-content/uploads/2026/10/eyecatch-7248.png)




