この記事では、Java配列の宣言・初期化から応用操作・実務での注意点まで解説します。

この記事を読めば、Java配列の宣言・初期化・ループ処理・ArrayListとの使い分けまで、実務でも通用する知識が一通り身につきます。
ぜひ参考にしてみてください。
Java配列とは?特徴と知っておくべき3つのルール

Java配列の基本を理解するために、まず仕組みを確認しておきましょう。
- 配列が「同じ型のデータをまとめる箱」である理由
- 配列の3つの特徴
順に解説していきます。
配列とは、同じ型のデータをまとめる箱
配列とは、同じデータ型の値を一列に並べて管理するためのデータ構造です。
たとえばテストの点数が5人分あるとします。変数を5つ用意する書き方もありますが、管理がかなり大変です。
int score1 = 80;
int score2 = 75;
int score3 = 90;
int score4 = 65;
int score5 = 88;これを配列にまとめると、1行で書けます。
int[] scores = {80, 75, 90, 65, 88};変数を5つ管理する必要がなくなりますし、for文などのループ処理と組み合わせると、全データを一気に操作できます。
「複数の同じ型データを、まとめて・順番に・ひとつの名前で管理する」というのが配列の本質です。
配列の3つの特徴
配列には3つの重要なルールがあります。ここを曖昧にしたままコードを書くと、意外なエラーに悩まされます。
①サイズは作成時に固定される
配列は、作った時点でサイズが決まります。後から変えることはできません。
int[] numbers = new int[5]; // 5要素で固定「あとで1個追加したい」と思っても、配列の長さは変わりません。
要素数が増減するケースには、後述するArrayListが向いています。
②インデックスは0から始まる
配列の各要素には番号(インデックス)がついており、0番から始まります。
int[] scores = {80, 75, 90, 65, 88};
// scores[0] → 80(1番目の要素)
// scores[4] → 88(5番目の要素)
// scores[5] → エラー!(範囲外)5要素の配列の有効インデックスは0〜4です。「5番目だから5」と書くと範囲外エラーになります。
特にミスが多いポイントなので、しっかり頭に入れておきましょう。
③配列は参照型である
Javaでは、配列はint・doubleのようなプリミティブ型(値そのものを持つ型)ではなく、参照型として扱われます。
参照型とは、変数に「値そのもの」ではなく「値が格納されている場所(アドレス)」が入っている型のことです。
これが何を意味するかというと、配列を別の変数に代入すると、同じ配列を指した状態になるということです。
int[] a = {1, 2, 3};
int[] b = a; // 同じ配列を参照している
b[0] = 100;
System.out.println(a[0]); // 100 → aも変わる!この「参照渡し」の挙動は、後の章でも詳しく取り上げます。
ここで押さえた3つのルールは、Java配列でつまずくポイントのほとんどをカバーしています。
「インデックスは0始まり」と「配列は参照型」の2つは、実務でも新人エンジニアがよくハマる箇所です。コードを書く前に頭に入れておくだけで、デバッグの時間がかなり変わりますよ。
Java配列の書き方|宣言・初期化・要素へのアクセス

ここからは、実際に配列を作って操作する方法を解説します。
- 配列の宣言と初期化の2つの書き方
- インデックスを使った要素の取得と更新
- length(長さ)を取得する方法
1つずつ確認していきましょう。
配列の宣言と初期化の書き方
Javaで配列を用意するには2通りの書き方があります。どちらも現場でよく見るので、両方覚えておくと安心です。
new演算子を使う書き方
最初にサイズだけ決めて、後から値を代入するやり方です。
// 書き方
データ型[] 変数名 = new データ型[要素数];
// 例:int型の5要素配列を作成
int[] scores = new int[5];
// 後から値を代入
scores[0] = 80;
scores[1] = 75;
scores[2] = 90;`new`演算子(オブジェクトを新しく生成する命令)を使って配列を作ります。
この時点での初期値は、int型なら0、String型ならnull、boolean型ならfalseです。
「後からループで値を入れたい」「最初は空にしておきたい」場面に向いています。
宣言と同時に初期値を設定する書き方
値が最初からわかっているなら、宣言と同時に セットできます。
// 書き方
データ型[] 変数名 = {値1, 値2, 値3, ...};
// 例
int[] scores = {80, 75, 90, 65, 88};
String[] names = {"田中", "佐藤", "山田"};`new`を書かなくて済むので、短くスッキリ書けます。
テストデータや固定の定数リストを作るときによく使うやり方です。
インデックスを使った要素の取得と更新
配列の要素を取得・更新するには、インデックスを指定します。
int[] scores = {80, 75, 90, 65, 88};
// 要素の取得
int first = scores[0]; // 80
int third = scores[2]; // 90
// 要素の更新
scores[1] = 85;
System.out.println(scores[1]); // 85基本の形は「配列名[インデックス]」です。
インデックスの範囲を超えると`ArrayIndexOutOfBoundsException`(配列の範囲外アクセスエラー)が発生するので、要素数との関係を常に意識しながら書きましょう。
length(長さ)を取得する方法
配列の要素数は`.length`プロパティで取得します。
int[] scores = {80, 75, 90, 65, 88};
System.out.println(scores.length); // 5`.length`はメソッドではなくプロパティなので、末尾に`()`は不要です。
String型の`.length()`とは別物なので、混同しないよう注意しましょう。
実務でよく使う場面は、ループの終了条件です。
for (int i = 0; i < scores.length; i++) {
System.out.println(scores[i]);
}`scores.length`を使っておけば、配列のサイズが変わっても終了条件を書き直す必要がありません。
直接数値を書くより保守性が高くなります。
配列の宣言・初期化・要素アクセスの3セットが書けると、基本操作は一通りこなせます。
`new int[5]`と`{1, 2, 3, 4, 5}`の使い分けは「後で値を入れるか・最初から決まっているか」で考えると整理しやすいです。どちらも書けるようにしておくと、コードの意図が伝わりやすくなりますよ。
Java配列の応用操作|ループ処理・ソート・多次元配列

基本の書き方が身についたら、配列の活用範囲を広げていきましょう。
- for文・拡張for文で配列を繰り返し処理する
- Arrays.sort()で配列をソートする
- 2次元配列(多次元配列)の宣言と使い方
順に解説していきます。
for文・拡張for文で配列を繰り返し処理する
配列の全要素に対して処理を行うには、ループ処理と組み合わせます。書き方は主に2種類あります。
for文(インデックスを使う方法)
int[] scores = {80, 75, 90, 65, 88};
for (int i = 0; i < scores.length; i++) {
System.out.println("スコア" + (i + 1) + ": " + scores[i]);
}インデックスを使うので、「何番目の要素か知りたい場合」や「要素を書き換えたい場合」に向いています。
拡張for文(foreach文)
int[] scores = {80, 75, 90, 65, 88};
for (int score : scores) {
System.out.println("スコア: " + score);
}「配列の全要素を順に取り出す」という意図が明確で、コードもスッキリします。
インデックスが不要なら拡張for文の方が読みやすいです。
2つの使い分けポイントは以下の通りです。
- 全要素を参照するだけなら:拡張for文(シンプルで読みやすい)
- インデックスが必要なら:通常のfor文
- 要素を書き換えたいなら:通常のfor文(拡張for文では配列の中身は変わらない)
実務では「拡張for文で十分な場面でも、なんとなく通常のfor文を使ってしまう」という人を見かけます。
目的に合った書き方を選ぶと、コードの意図が読み手に伝わりやすくなります。
Arrays.sort()で配列をソートする
配列を昇順(小さい順)に並べ替えるには、`Arrays.sort()`を使います。
import java.util.Arrays;
int[] scores = {80, 75, 90, 65, 88};
Arrays.sort(scores);
System.out.println(Arrays.toString(scores));
// 出力: [65, 75, 80, 88, 90]`Arrays`クラスはJava標準ライブラリに含まれており、ファイルの先頭で`import java.util.Arrays;`と記述する必要があります。
`Arrays.toString()`は配列の中身を`[65, 75, 80, 88, 90]`の形式で出力してくれるメソッドです。
デバッグ時に中身を確認するのに重宝します。
`Arrays`クラスの全メソッドはOracle公式ドキュメント(Java 17)にまとまっています。
降順ソートやコピーなど、他のメソッドも合わせてチェックしてみてください。
2次元配列(多次元配列)の宣言と使い方
2次元配列とは、配列の中にさらに配列が入っている構造です。
表やマトリクス形式のデータを扱うときに登場します。
// 宣言と初期化
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 要素へのアクセス:[行インデックス][列インデックス]
System.out.println(matrix[0][0]); // 1(1行1列目)
System.out.println(matrix[1][2]); // 6(2行3列目)アクセスは`[行インデックス][列インデックス]`の形で指定します。
どちらも0始まりです。
2次元配列のループは、for文を2重にします。
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}主な活用シーンは以下の通りです。
- ゲームのマップデータ:縦横のマス目がある地形情報
- 時間割・カレンダー:行が曜日、列が時間帯の表形式データ
- 行列計算:数値処理や機械学習の前処理
実務のWebアプリ開発では2次元配列よりListのListやMapを使う場面の方が多いです。
仕組みを理解しておくと読めるコードの幅が広がります。
ループ・ソート・2次元配列まで使えると、Java配列の操作範囲がぐっと広がります。
拡張for文ってスッキリ書けていいね。普通のfor文との使い分けも整理できてきた!
使い分けを意識するだけで、コードを読んだ人が「このループは要素を変更しないんだな」と判断できるようになるよ。意図の伝わるコードを書く習慣が、実務では大事だね。
実務で差がつく配列の使い方|ArrayListとの使い分けとエラー対処

基本操作を覚えたら、「現場で通用するレベル」に引き上げていきましょう。
- 配列とArrayListの使い分け基準
- ArrayIndexOutOfBoundsExceptionの原因と対処法
- 配列コピーで落とし穴になる「参照渡し」の仕組み
それぞれ解説します。
配列とArrayListの使い分け基準
Javaには配列と似た機能を持つArrayList(アレイリスト)というクラスがあります。
どちらを選ぶか迷う場面は多いですが、判断基準はシンプルです。
使い分けの基準は以下の通りです。
- 要素数が固定ならば配列:処理速度が速く、メモリ効率も良い
- 要素数が変動するならArrayList:後から要素の追加・削除が自由にできる
- プリミティブ型を大量に扱うなら配列:ArrayListはオートボクシング(整数などを自動でオブジェクトに変換する処理)のコストがかかる
- コレクション操作が多いならArrayList:`add()`・`remove()`・`contains()`など便利なメソッドが揃っている
実務では最初からArrayListを選ぶケースが多いです。
要素数が変動する場面が多く、メソッドも充実しているからです。
僕自身、大手商業施設の在庫管理アプリを開発していたとき、商品リストはArrayListで管理していました。商品数が常に変動するため、サイズ固定の配列より可変なArrayListの方が設計として自然だったからです。
それでも配列の基礎を知らないと、ArrayListの仕組みも理解しづらくなります。
まず配列から学ぶのは、正しい順番だと思っています。
ArrayIndexOutOfBoundsExceptionの原因と対処法
Java配列で最も多いエラーが`ArrayIndexOutOfBoundsException`(配列インデックス範囲外例外)です。
int[] scores = {80, 75, 90};
System.out.println(scores[3]); // エラー発生
// → ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 33要素の配列の有効インデックスは0〜2です。`scores[3]`は存在しないので例外が発生します。
このエラーが出たときの確認ポイントは以下の通りです。
- `scores.length`で配列サイズを確認する:想定と一致しているか
- ループの終了条件を確認する:`i <= scores.length`は間違い。正しくは`i < scores.length`
- インデックスの計算ロジックを確認する:計算結果が配列サイズを超えていないか
僕も最初のJava研修のとき、ループ条件を`i <= scores.length`と書いてしまい、このエラーを何度か出しました。`<=`と`<`のたった1文字の違いですが、慣れるまでは意外と引っかかるんですよね。
エラーメッセージに「Index 3 out of bounds for length 3」と書いてあれば、「インデックス3にアクセスしようとしたが、長さ3の配列には存在しない」という意味です。
メッセージを落ち着いて読むと、原因がすぐに特定できます。
配列コピーで落とし穴になる「参照渡し」の仕組み
先ほど触れた「参照型の特性」について、もう少し詳しく見ていきます。
int[] a = {1, 2, 3};
int[] b = a; // bにaの参照(場所)をコピーしている
b[0] = 99;
System.out.println(a[0]); // 99(aも変わってしまう)`b = a`は「配列の中身のコピー」ではなく、「同じ配列を指している状態」です。
片方を変えると、もう片方も変わります。
配列の値を独立してコピーしたい場合は、`Arrays.copyOf()`を使います。
import java.util.Arrays;
int[] a = {1, 2, 3};
int[] b = Arrays.copyOf(a, a.length); // 値のコピー
b[0] = 99;
System.out.println(a[0]); // 1(aは変わらない)これを「シャローコピー(浅いコピー)」といいます。
2次元配列の場合は内部の配列も個別にコピーする「ディープコピー(深いコピー)」が必要になりますが、まずは1次元配列での挙動をしっかり押さえておきましょう。
「代入はコピーではない」というJava参照型の特性は、実務でも一度は引っかかるポイントです。
ArrayListの使い分けやエラー対処まで理解できると、実務レベルのJavaコードをかなり読めるようになります。
Java配列に関するよくある質問(FAQ)

よくある質問と回答をまとめました。
Java配列のサイズは後から変えられますか?
結論、変えられません。
Javaの配列はサイズが固定されており、作成後に変更することができない仕様です。
サイズを変えたい場合は、次の2つの方法があります。
- ArrayListを使う:最初からサイズが変わる前提ならArrayListが適切
- 新しい配列を作り直す:`Arrays.copyOf()`でサイズの大きい配列を新規作成し、元の要素をコピーする
int[] original = {1, 2, 3};
int[] expanded = Arrays.copyOf(original, 5); // サイズ5に拡張
// expanded → [1, 2, 3, 0, 0](追加分は0で初期化)サイズが可変のコレクションが必要な場面では、ArrayListを選ぶのが実務では主流です。
配列とArrayListはどちらを使えばいいですか?
迷ったらArrayListを選ぶのが、実務では多いです。
ArrayListはサイズが自由に変えられる上に、`add()`・`remove()`・`contains()`など便利なメソッドが揃っています。
コードの可読性も上がりやすいです。
ただし、次のケースでは配列を選ぶ理由があります。
- パフォーマンスが最優先なシステム
- サイズが完全に固定された定数データ(例:曜日名・月名リスト)
- バイト配列などの低レベルデータ操作が必要な場合
Javaの学習段階では「まず配列を理解し、次にArrayListを使えるようにする」という順番がおすすめです。
配列の基礎があると、ArrayListの内部の仕組みも理解しやすくなります。
以下記事でArrayListについて詳しく解説しているので、ぜひ参考にしてみてください。

多次元配列はどんなときに使いますか?
縦横2軸でデータを管理したい場面に向いています。
よく見るユースケースは以下の通りです。
- ゲームのマップデータ:縦横のマス目がある地形情報
- 時間割・カレンダー:行が曜日、列が時間帯の表形式データ
- 行列計算:数値処理・機械学習の前処理
実務のWebアプリ開発では2次元配列よりListのListやMapを使う場面が多いです。
概念として理解した上で、まずは1次元配列をしっかり使いこなすことを優先しましょう。
「配列かArrayListか」は現場でも判断が分かれます。どちらを選ぶにも理由がある、という視点で学ぶと、コードレビューでも自信を持って説明できるようになりますよ。
配列の基本を固めて、Javaの次のステップへ進もう

Java配列の基本から応用・実務での注意点まで、ひと通り解説しました。
重要なポイントをまとめます。
- サイズは固定:作成後に変更不可。可変ならArrayListを使う
- インデックスは0始まり:5要素なら有効範囲は0〜4
- 参照型に注意:代入はコピーではない。コピーには`Arrays.copyOf()`を使う
- ループを活用する:for文・拡張for文で目的に合った書き方を選ぶ
- ArrayListと使い分ける:固定なら配列、可変ならArrayList
配列は、Javaのコレクションやアルゴリズムへとステップアップする上でも欠かせない基礎です。
今のうちに繰り返し書いて、手に馴染ませておきましょう。
配列ってこんなに奥が深いんだね。参照渡しとかArrayListとの違いとか、ちゃんと理解してから書けるようにしたい!
仕組みを理解してから書くと、エラーに当たっても「なぜ起きたか」が読めるようになるよ。あとはとにかく手を動かして、どんどんコードを書いてみよう!