Javaの学習を始めたばかりのころ、多くの人が「配列」という概念でつまずきがちです。
私自身、Javaを学び始めたとき、変数に1つの値しか入れられない世界から、急に複数の値を扱える配列が登場し、頭が混乱した経験があります。
しかし、現場で数多くのJavaコードに触れてきた今、断言できることがあります。
それは、Javaの配列をきちんと理解することが、その後の上達スピードを大きく左右するということです。
この記事は、以下のような悩みを持つJava初心者の方に向けて書きました。
この記事を最後まで読めば、Javaの配列の基礎知識から、実践的な使い方を体系的に理解できます。
豊富なコード例とともに、つまずきやすいポイントを丁寧に解説していくので、ぜひあなたの学習に役立ててください。
Javaの配列とは?基本の仕組み

Javaプログラミングにおいて、配列は複数のデータを効率的に扱うための基本的な仕組みです。最初に、配列の概念と基本文法をしっかりと押さえましょう。
配列とは何か?変数との違い
配列とは、同じ型の複数のデータを、連続した箱にまとめて格納する仕組みです。
たとえば、テストの点数を管理したい場合を考えてみましょう。変数の場合、生徒5人分の点数を保存するには、5個の変数が必要です。
int score1 = 80;
int score2 = 95;
int score3 = 70;
int score4 = 88;
int score5 = 92;これでは、生徒が100人になったら100個の変数が必要になり、管理が非常に大変になります。
一方、配列を使えば、これらの点数を1つのまとまりとして扱えます。
int[] scores = {80, 95, 70, 88, 92};1つのscoresという名前で、5つの点数データを管理できるようになるのです。これが変数とJava配列の大きな違いです。
Javaで配列が必要になる理由
Javaで配列が必要になる最大の理由は、大量のデータを効率的に処理できるからです。
先ほどのテストの点数の例のように、たくさんのデータを扱いたい場面はプログラミングでは頻繁に登場します。
配列を使えば、繰り返し処理(for文など)と組み合わせることで、大量のデータに対する操作をわずか数行のコードで記述できます。
もし配列がなければ、データ1つひとつに対して同じ処理を何度も書く必要があり、コードが長くなるだけでなく、修正も大変でミスも発生しやすくなるでしょう。
配列の宣言と初期化の基本文法
Javaで配列を利用するには、まず「宣言」と「初期化」が必要です。
宣言は、「これからこの名前で、この型の配列を使いますよ」とコンピューターに伝える作業です。
// 構文: 型[] 配列名;
int[] scores; // int型の値を格納するscoresという名前の配列を宣言
String[] names; // String型の値を格納するnamesという名前の配列を宣言初期化は、配列が実際にいくつのデータを格納できるのか、箱(要素)を確保する作業です。初期化には、大きく分けて2つの方法があります。
1. 要素数を指定して初期化する方法
newキーワードを使い、配列のサイズ(要素数)を指定して作成します。
この場合、各要素はデータ型の初期値(intなら0、Stringならnull)で自動的に埋められます。
// 構文: 配列名 = new 型[要素数];
scores = new int[5]; // int型の要素を5つ格納できる配列を作成もちろん、宣言と初期化は1行で書くことも可能です。
// 構文: 型[] 配列名 = new 型[要素数];
int[] scores = new int[5]; // 宣言と同時に5つの要素を持つ配列を初期化2. 初期値を指定して初期化する方法
宣言と同時に、{}(波括弧)の中に具体的な値を入れて配列を作成する方法です。この場合、指定した値の数で配列のサイズが自動的に決まります。
// 構文: 型[] 配列名 = {値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というエラーが発生します。
これはJava初心者が非常によく遭遇するエラーなので、インデックスは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というプロパティを使います。
これは、特に後述する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拡張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次元配列は、配列の中にさらに配列が入っている構造をしています。エクセルのシートや、碁盤の目をイメージすると分かりやすいでしょう。
宣言や初期化は、[]を2つ続けて記述します。
1. 要素数を指定して初期化する方法
// 構文: 型[][] 配列名 = new 型[行数][列数];
// 3行2列のint型2次元配列を作成
int[][] matrix = new int[3][2];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行目: 英語の点数
};二重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(): 配列の並べ替え(ソート)要素を昇順(小さい順)に並べ替えます。
import java.util.Arrays; int[] numbers = {50, 20, 80, 10, 40}; Arrays.sort(numbers); // numbersの中身は {10, 20, 40, 50, 80} に変わる - binarySearch(): 配列の検索ソート済みの配列から、指定した値のインデックスを高速に検索します。配列がソート済みであることが前提なので注意が必要です。
int[] numbers = {10, 20, 40, 50, 80}; // ソート済み int index = Arrays.binarySearch(numbers, 40); // indexは 2 となる - equals(): 配列の比較2つの配列の要素が全て同じかどうかを比較します。
int[] a = {1, 2, 3}; int[] b = {1, 2, 3}; boolean isEqual = Arrays.equals(a, b); // trueが返される
toString()で配列を文字列に変換する
配列変数をそのままSystem.out.println()で出力しようとすると、[I@...のような意味不明な文字列が表示されてしまいます。
これは配列のメモリ上のアドレスを示しているためです。
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()で配列をコピーする方法
配列のコピーには注意が必要です。=を使って代入すると、配列そのものではなく、配列の場所情報(参照)だけがコピーされます。
int[] original = {1, 2, 3};
int[] copy = original; // これは参照のコピー
copy[0] = 99; // コピーした配列の要素を変更すると...
System.out.println(Arrays.toString(original)); // 実行結果: [99, 2, 3]
// 元の配列まで変わってしまう!配列の要素を丸ごと新しい別の配列にコピーしたい場合は、System.arraycopy()メソッドを使います。
// 構文: 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]
// 元の配列は影響を受けない配列に要素を追加・削除する方法
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()メソッドを使います。
// ArrayListから配列へ変換する
Integer[] resultArray = list.toArray(new Integer[0]);
System.out.println(Arrays.toString(resultArray)); // 実行結果: [2, 3, 4]頻繁に要素の追加・削除が発生する場面では、最初から配列ではなくArrayListでデータを管理するほうがシンプルで安全です。
配列の結合と最大値・最小値の取得
2つの配列を1つに結合したい場合もArrays.copyOf()とSystem.arraycopy()を組み合わせて実現できます。
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]配列の最大値・最小値を求めたい場合は、Arrays.stream()でStreamに変換し、max()/min()メソッドを使うと簡潔に書けます。
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よくある質問
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への変換が実務では一般的。


