Javaの配列を完全マスターするための教科書

2025年8月15日金曜日

Java

プログラミング学習におけるJavaの配列は、多くのデータを効率的に扱うための基本的な技術です。

この記事では、Javaの配列とは何かという概念的な説明から、宣言や初期化といった基本的な使い方、ループ処理での活用法、さらには実践的なサンプルコードまでを網羅的に解説します。

この記事で学べること

  • Javaにおける配列の基本的な概念とメリット
  • 配列の宣言・初期化・値の操作方法
  • ループを使った効率的な配列の処理
  • ArrayListとの違いと使い分けのポイント
  • 初心者が陥りがちなエラーとその解決策

Javaの配列とは?

この章では、Javaの配列がどのようなものかを解説します。変数をたくさん用意する手間を省き、データをまとめて管理できる便利な仕組みを学びます。

  • 配列を一言でいうと「データの箱」
  • なぜ配列を使うの?メリットを解説
  • 配列と変数の違いを理解しよう

配列を一言でいうと「データの箱」

Javaの配列とは、同じ型のデータを複数まとめて格納できる、整理された大きな箱のようなものです。
例えば、テストの点数を5教科分保存したい場合、変数を5つ用意するのは少し面倒に感じませんか。

配列を使えば、「点数」という名前の1つの箱の中に、5つの仕切りを作ってそれぞれの点数を格納できます。

// 5教科の点数を入れる配列
int[] scores = { 85, 92, 78, 95, 88 };

このように1つの名前で、複数のデータを管理できるのが配列の大きな特徴です。

なぜ配列を使うの?メリットを解説

配列を使うことには、主に2つの大きなメリットがあります。

1. 複数のデータをまとめて管理できる
関連性のあるデータを1つの変数名で管理できるため、プログラムのコードが簡潔になります。データの集合を扱う際に、非常に役立ちます。

2. 繰り返し処理(ループ)と相性が良い
配列に格納されたデータは、ループ処理を用いることで効率的に一つずつ取り出して処理できます。例えば、全教科の合計点を計算する処理も、ループを使えば数行で書くことが可能です。

配列と変数の違いを理解しよう

変数と配列の最も大きな違いは、1つの名前で保持できる値の数です。変数は1つの名前に対して1つの値しか保持できませんが、配列は1つの名前で複数の値を保持できます。

この違いを簡単な図で見てみましょう。

【変数 number のイメージ】
+--------+
|   10   |
+--------+

【配列 numbers のイメージ】
  [0]    [1]    [2]   <-- インデックス番号
+------+------+------+
|  10  |  20  |  30  |  <-- 要素(値)
+------+------+------+

配列には「インデックス」と呼ばれる、0から始まる番号が各データに割り振られています。この番号を指定することで、目的のデータにアクセスできます。

Java配列の基本的な使い方をマスターしよう

ここでは、Javaで配列を実際に使うための手順を解説します。配列の宣言から初期化、値の代入・参照まで、基本的な操作を一つずつマスターしていきましょう。

  • ステップ1:配列を宣言する方法
  • ステップ2:配列を初期化する3つのパターン
  • ステップ3:配列に値を代入・参照する方法(インデックス)
  • ステップ4:配列の要素数を調べる方法

ステップ1:配列を宣言する方法

はじめに、どのようなデータ型の値をいくつ格納する配列なのかをコンピュータに教える「宣言」を行います。
書き方はシンプルで、「データ型[] 配列名;」と記述するのが一般的です。

// int型の値を格納する配列を宣言
int[] scores;

// String型の値を格納する配列を宣言
String[] names;

`int scores[];`のように配列名を後ろに書く方法もありますが、`int[]`で「int型の配列」という意味が分かりやすいため、型名の後ろに`[]`を付ける書き方が推奨されています。

ステップ2:配列を初期化する3つのパターン

宣言しただけでは、配列はまだ使えません。次に、実際にデータを格納するための箱(要素)を作成する「初期化」という作業が必要です。初期化にはいくつかの方法があります。

パターン1:要素数を指定して初期化
格納するデータ数は決まっているけれど、値は後から入れたい場合に使う方法です。

// int型の要素を5つ格納できる配列を作成
int[] numbers = new int[5];

パターン2:初期値を指定して初期化
配列を作成すると同時に、格納する値を決めてしまう方法です。

// 配列の作成と同時に初期値を設定
String[] fruits = {"Apple", "Banana", "Cherry"};

パターン3:宣言と初期化を同時に行う
パターン2をより簡潔に書く方法で、宣言と初期化の処理を1行でまとめて記述します。

// 宣言と初期化を1行で記述
int[] ages = {25, 30, 22};

ステップ3:配列に値を代入・参照する方法(インデックス)

配列の各要素にアクセスするには、0から始まる「インデックス」を使います。インデックスを指定して、値を代入したり、値を取得したりするのが基本です。

public class ArrayExample {
    public static void main(String[] args) {
        // 要素数3のString型配列を宣言・初期化
        String[] colors = new String[3];

        // インデックスを使って値を代入
        colors[0] = "Red";
        colors[1] = "Green";
        colors[2] = "Blue";

        // インデックスを指定して値を参照(取得)
        System.out.println("インデックス1の色は " + colors[1] + " です。");
    }
}

実行結果

インデックス1の色は Green です。

ステップ4:配列の要素数を調べる方法

配列にいくつの要素が格納できるかを知りたい場合は、`length`というプロパティを使います。`配列名.length`と記述することで、配列の要素数を取得できるので、特にループ処理で重宝します。

public class ArrayLength {
    public static void main(String[] args) {
        String[] subjects = {"国語", "数学", "理科", "社会", "英語"};

        // 配列の要素数を取得して表示
        System.out.println("教科の数は " + subjects.length + " です。");
    }
}

実行結果

教科の数は 5 です。

この`length`は、あくまで配列を作成したときに決めたサイズ(箱の数)を返す点に注意しましょう。実際に値が入っている数ではありません。

インデックスは「0」から始まる!

プログラミング初心者が間違いやすいポイントの一つが、配列のインデックスは必ず0から始まる点です。要素数が5の配列の場合、インデックスは0, 1, 2, 3, 4となります。インデックスに5を指定すると、範囲外となりエラーが発生するため、十分に注意しましょう。

Javaの配列をループで効率的に扱おう

配列の真価は、ループ処理と組み合わせることで発揮されます。ここでは、配列の全要素に対して効率的に処理を行うための、基本的なループの書き方を解説します。

  • 基本のfor文で全要素にアクセスする
  • もっと簡単!拡張for文の使い方
  • while文を使った配列のループ処理

基本のfor文で全要素にアクセスする

for文と`length`プロパティを組み合わせるのが、配列処理の基本形です。カウンタ変数`i`をインデックスとして使い、配列の最初から最後まで順番にアクセスします。

public class ArrayForLoop {
    public static void main(String[] args) {
        int[] scores = {88, 95, 74, 90, 82};
        int sum = 0; // 合計点を格納する変数

        // forループで全要素にアクセスし、合計を計算
        for (int i = 0; i < scores.length; i++) {
            sum += scores[i]; // sum = sum + scores[i] と同じ
            System.out.println((i + 1) + "番目の点数: " + scores[i]);
        }

        System.out.println("合計点: " + sum);
        System.out.println("平均点: " + (double)sum / scores.length);
    }
}

実行結果

1番目の点数: 88
2番目の点数: 95
3番目の点数: 74
4番目の点数: 90
5番目の点数: 82
合計点: 429
平均点: 85.8

もっと簡単!拡張for文の使い方

Java 5から導入された拡張for文(for-each文)を使うと、配列の処理をよりシンプルに記述できます。インデックス番号が不要で、単純に全要素を順番に取り出したい場合に非常に便利です。

書き方は `for (データ型 変数名 : 配列名)` となります。

public class ArrayForEach {
    public static void main(String[] args) {
        String[] languages = {"Java", "Python", "Ruby", "Go"};

        System.out.println("学習したいプログラミング言語一覧:");
        // 拡張for文で全要素を順番に取り出して表示
        for (String lang : languages) {
            System.out.println(lang);
        }
    }
}

実行結果

学習したいプログラミング言語一覧:
Java
Python
Ruby
Go

コードがすっきりして、目的が分かりやすくなりました。

while文を使った配列のループ処理

for文ほど頻繁には使いませんが、`while`文でも配列のループ処理は可能です。ループ用のカウンタ変数を別途用意し、ループ内でインクリメント(+1)する必要があります。

public class ArrayWhileLoop {
    public static void main(String[] args) {
        char[] alphabets = {'a', 'b', 'c', 'd', 'e'};
        int index = 0; // カウンタ変数を初期化

        // whileループで全要素を表示
        while (index < alphabets.length) {
            System.out.print(alphabets[index] + " ");
            index++; // カウンタ変数をインクリメント
        }
    }
}

実行結果

a b c d e 

Java配列の便利な使い方7選

ここでは、Javaの配列を使ったより実践的なプログラム例を7つ紹介します。基本的な文法を理解したら、これらのコードを参考に、配列でどのようなことができるのかを体験してみましょう。

  • ① 数値の合計と平均を計算する
  • ② 配列の中から最大値・最小値を見つける
  • ③ 配列の要素を並び替える(ソート)
  • ④ 配列内の要素を検索する
  • ⑤ 配列の要素を逆順にする
  • ⑥ 2つの配列を結合する
  • ⑦ 配列の重複要素を削除する

① 数値の合計と平均を計算する

ループ処理の基本です。for文を使って全要素を足し合わせ、最後に要素数で割ることで平均を算出します。

int[] data = {10, 20, 30, 40, 50};
int sum = 0;
for (int num : data) {
    sum += num;
}
double average = (double)sum / data.length;
System.out.println("合計: " + sum); // 合計: 150
System.out.println("平均: " + average); // 平均: 30.0

② 配列の中から最大値・最小値を見つける

配列の最初の値を暫定の最大値(または最小値)としておき、ループで残りの要素と比較していく方法が一般的です。

int[] numbers = {34, 12, 58, 9, 77, 23};
int max = numbers[0]; // 暫定の最大値
for (int i = 1; i < numbers.length; i++) {
    if (numbers[i] > max) {
        max = numbers[i]; // より大きい値が見つかったら更新
    }
}
System.out.println("最大値: " + max); // 最大値: 77

③ 配列の要素を並び替える(ソート)

Javaには、配列を簡単に並び替えるための便利な機能が用意されています。`Arrays.sort()`メソッドを使うと、配列の要素を昇順(小さい順)に並び替えることができます

import java.util.Arrays;

// ...

int[] arrayToSort = {5, 2, 8, 1, 9};
Arrays.sort(arrayToSort); // 配列をソート
System.out.println(Arrays.toString(arrayToSort)); // [1, 2, 5, 8, 9]

この`Arrays`クラスは、配列操作に役立つ機能が多く含まれているため、覚えておくと非常に便利です。このような便利な機能を学ぶには、『スッキリわかるJava入門 第4版』のような、標準ライブラリの解説が丁寧な書籍が役立ちます。

④ 配列内の要素を検索する

指定した値が配列の中に含まれているかどうかを、先頭から順番に探していく処理(線形探索)です。

String[] pokemons = {"Pikachu", "Eevee", "Snorlax"};
String target = "Eevee";
boolean found = false;

for (String p : pokemons) {
    if (p.equals(target)) {
        found = true;
        break; // 見つかったらループを抜ける
    }
}
System.out.println("見つかったか: " + found); // 見つかったか: true

⑤ 配列の要素を逆順にする

配列の先頭の要素と末尾の要素を交換し、次に内側の要素ペアを交換していく、という処理を配列の中央まで繰り返します。

import java.util.Arrays;

// ...

int[] original = {1, 2, 3, 4, 5};
for (int i = 0; i < original.length / 2; i++) {
    int temp = original[i];
    original[i] = original[original.length - 1 - i];
    original[original.length - 1 - i] = temp;
}
System.out.println(Arrays.toString(original)); // [5, 4, 3, 2, 1]

⑥ 2つの配列を結合する

新しい配列を、結合したい2つの配列の合計サイズで作成し、`System.arraycopy()`を使って各配列の内容をコピーします。

import java.util.Arrays;

// ...

int[] array1 = {1, 2, 3};
int[] array2 = {4, 5, 6};
int[] combined = new int[array1.length + array2.length];

System.arraycopy(array1, 0, combined, 0, array1.length);
System.arraycopy(array2, 0, combined, array1.length, array2.length);

System.out.println(Arrays.toString(combined)); // [1, 2, 3, 4, 5, 6]

⑦ 配列の重複要素を削除する

一度`Set`というデータ構造に変換して重複を除き、再び配列に戻すのがスマートな方法です。`Set`は重複した値を持てない特性があります。

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

// ...

Integer[] arrayWithDuplicates = {1, 2, 3, 2, 4, 5, 1};
Set<Integer> set = new HashSet<>(Arrays.asList(arrayWithDuplicates));
Integer[] arrayWithoutDuplicates = set.toArray(new Integer[0]);

System.out.println(Arrays.toString(arrayWithoutDuplicates)); // [1, 2, 3, 4, 5] (順序は保証されない)

ちょっとステップアップ!Javaの多次元配列

Javaの配列は、1次元だけでなく、2次元、3次元といった多次元配列も扱うことができます。ここでは、最もよく使われる2次元配列について解説します。

  • 2次元配列とは?
  • 2次元配列の宣言と初期化
  • 2次元配列の値を操作する方法

2次元配列とは?

2次元配列とは、配列の中にさらに配列が入っている構造のことで、表計算ソフトのマス目や、数学の行列のようなイメージです。

【2次元配列 seatingChart のイメージ】
       [0]    [1]    [2]   <-- 列インデックス
 [0] +------+------+------+
     | "A-1"| "A-2"| "A-3"|
     +------+------+------+
 [1] | "B-1"| "B-2"| "B-3"|
     +------+------+------+
  ^
  |
 行インデックス

このように、行と列の2つのインデックスを使って、特定の要素にアクセスします。

2次元配列の宣言と初期化

2次元配列の宣言は`[]`を2つ続けます。`データ型[][] 配列名;`と記述します。

// 2行3列のString型2次元配列を宣言・初期化
String[][] seatingChart = new String[2][3];

// 宣言と同時に初期化も可能
int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

2次元配列の値を操作する方法

値の代入や参照は、2つのインデックスを`[行][列]`の順で指定します。また、全ての要素を処理するには、ループを二重にネストさせるのが一般的です。

public class TwoDArrayExample {
    public static void main(String[] args) {
        int[][] scoreTable = new int[2][3]; // 2人分、3教科の点数表

        // 値を代入 (1人目)
        scoreTable[0][0] = 90; // 国語
        scoreTable[0][1] = 85; // 数学
        scoreTable[0][2] = 88; // 英語

        // 値を代入 (2人目)
        scoreTable[1][0] = 78;
        scoreTable[1][1] = 92;
        scoreTable[1][2] = 80;

        // ネストしたfor文で全要素を表示
        for (int i = 0; i < scoreTable.length; i++) { // 行のループ
            for (int j = 0; j < scoreTable[i].length; j++) { // 列のループ
                System.out.print(scoreTable[i][j] + " ");
            }
            System.out.println(); // 行ごとに改行
        }
    }
}

実行結果

90 85 88 
78 92 80 

Javaの配列とArrayList、どっちを使うべき?

Javaで複数のデータを扱う際には、配列の他に`ArrayList`というクラスもよく使われます。両者は似ていますが、重要な違いがあり、状況に応じて使い分ける必要があります。

  • 最大の違いは「サイズの固定 vs 可変」
  • 配列とArrayListのメリット・デメリット比較
  • 現場での使い分けポイント

最大の違いは「サイズの固定 vs 可変」

配列とArrayListの最も本質的な違いは、一度作成した後のサイズを変更できるかどうかです。

  • 配列 (Array)
    作成時に決めた要素数(サイズ)を後から変更することはできません。

  • ArrayList
    要素を自由に追加したり削除したりでき、サイズが動的に変化します。

配列とArrayListのメリット・デメリット比較

それぞれの特性を、以下の表で比較してみましょう。

項目 配列 (Array) ArrayList
サイズ 固定 可変
パフォーマンス 一般的に高速 配列より若干遅い場合がある
格納できる型 プリミティブ型、参照型 参照型のみ(ラッパークラス使用)
機能 基本的な機能のみ 追加、削除など豊富なメソッド

現場での使い分けポイント

では、どのような基準で使い分ければよいのでしょうか。

配列が適しているケース

  • 扱うデータの個数が最初から決まっている場合
  • パフォーマンスが最優先される場合
  • `int`や`double`などのプリミティブ型を直接扱いたい場合

ArrayListが適しているケース

  • データの個数が予測できず、後から追加・削除が必要な場合
  • データの並び替えや検索など、便利なメソッドを使いたい場合

迷ったら、最初は柔軟性の高いArrayListを使うのが、多くの場面で安全な選択と言えます。

Java配列でつまずかない!よくあるエラーと解決策

Javaで配列を扱っていると、特定の種類の実行時エラーに遭遇することがあります。ここでは、初心者が特に遭遇しやすい2つのエラーについて、原因と解決策を解説します。

  • `ArrayIndexOutOfBoundsException`の原因と対策
  • `NullPointerException`の原因と対策

`ArrayIndexOutOfBoundsException`の原因と対策

このエラーは、配列の範囲外のインデックスにアクセスしようとしたときに発生します。
例えば、要素数が5(インデックスは0〜4)の配列に対して、インデックス5を指定した場合に起こります。

// 原因となるコード例
int[] numbers = new int[3]; // インデックスは 0, 1, 2
numbers[3] = 100; // 存在しないインデックス3にアクセス → エラー!

対策
ループ処理の条件式が正しいか(例:`i < array.length`となっているか)、インデックスを直接指定している場合はその値が範囲内かを確認しましょう。

`NullPointerException`の原因と対策

このエラーは、初期化されていない配列(`null`状態の配列)を使おうとしたときに発生します。

// 原因となるコード例
String[] names = null; // 配列変数をnullで初期化
System.out.println(names.length); // nullに対してlengthを呼び出す → エラー!

配列の変数を宣言しただけで、`new`を使ってインスタンス(実体)を生成していない場合も同じエラーが起こります。

対策
配列を使用する前には、必ず`new`キーワードを使って配列のインスタンスを生成し、初期化する習慣をつけましょう。

エラーの詳細は、Java™ Platform, Standard Edition 21 API仕様などで確認できます。公式の情報を参照する癖をつけると、より深い理解につながります。

まとめ

この記事では、Javaの配列について、その基本から応用までを幅広く解説しました。

  • 配列は、同じ型のデータをまとめて管理するための仕組み
  • `[]`で宣言し、`new`で初期化、インデックスで要素にアクセス
  • for文や拡張for文を使うと、効率的に全要素を処理できる
  • サイズの変更が必要な場合は`ArrayList`を検討する
  • 範囲外アクセスやnull参照のエラーに注意する

配列は、Javaだけでなく多くのプログラミング言語で基本となるデータ構造です。配列をしっかりマスターすることで、今後のプログラミング学習がよりスムーズに進むでしょう。

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ