【Java】2次元配列をArrayListで実装する方法を徹底解説!初心者向けサンプル付き

お疲れ様です。はるさらと申します。

Javaでは「2次元配列」を使うことで表形式のデータを扱うことができますが、
サイズが固定であるため柔軟性に欠けるという弱点があります。

実務や学習の中で「サイズが可変の2次元的なデータを扱いたい」
と考えることも多いでしょう。
そこで役立つのが ArrayListを使った2次元配列の代替実装 です。

この記事では、Javaにおける2次元配列とArrayListの違い、
具体的な初期化方法や実務での利用例をサンプルコード付きで解説します。


Javaの2次元配列とArrayListの違い

2次元配列の特徴

Javaの2次元配列は「配列の配列」として実装されています。

int[][] matrix = new int[3][4];

  • メリット:宣言時に行と列を固定できるためメモリ効率が良い
  • デメリット:サイズ変更ができない

ArrayListを使った2次元構造の特徴

ArrayList<ArrayList<T>> として実装すれば、柔軟に要素を追加・削除できます。

ArrayList<ArrayList<Integer>> list = new ArrayList<>();

  • メリット:サイズが自由に変えられる
  • デメリット:配列に比べて処理速度は若干遅くなる

基本的な実装方法:ArrayListで2次元配列を表現する

サンプル1:基本例

import java.util.ArrayList;
import java.util.Arrays;

public class ArrayList2DExample {
    public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();

        list.add(new ArrayList<>(Arrays.asList(1, 2, 3)));
        list.add(new ArrayList<>(Arrays.asList(4, 5, 6)));

        System.out.println(list.get(1).get(2)); // 出力: 6
    }
}

このように「リストの中にリストを持たせる」ことで、
柔軟な2次元構造を作れます。


実務での利用例:表形式データの管理

例えば、社員の勤務時間を「日付 × 社員ごと」に管理するケースを考えてみましょう。

サンプル2:勤務時間管理

import java.util.ArrayList;
import java.util.Arrays;

public class WorkLog {
    public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> workHours = new ArrayList<>();

        workHours.add(new ArrayList<>(Arrays.asList(8, 7, 6))); // 社員A
        workHours.add(new ArrayList<>(Arrays.asList(9, 8, 8))); // 社員B
        workHours.add(new ArrayList<>(Arrays.asList(7, 6, 9))); // 社員C

        System.out.println("社員Bの2日目: " + workHours.get(1).get(1) + "時間");
    }
}

このように可変長リストを使うことで、
社員数や日数が増えても柔軟に対応できます。


代替手法の比較:配列とArrayListの使い分け

サンプル3:配列との比較

public class CompareArrayAndList {
    public static void main(String[] args) {
        // 配列で実装(固定サイズ)
        int[][] matrix = {
            {1, 2, 3},
            {4, 5, 6}
        };

        // ArrayListで実装(可変サイズ)
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        list.add(new ArrayList<>(Arrays.asList(1, 2, 3)));
        list.add(new ArrayList<>(Arrays.asList(4, 5, 6)));

        System.out.println("配列: " + matrix[1][2]);  // 出力: 6
        System.out.println("ArrayList: " + list.get(1).get(2));  // 出力: 6
    }
}

  • 配列:固定長で高速、メモリ効率良し
  • ArrayList:柔軟にサイズ変更可能、データ操作が簡単

実務では「要素数が変わらない」なら配列
「柔軟性を重視」するならArrayListを選ぶと良いです。


間違えやすいポイント

  1. インデックス指定の違いを理解する
    • array[i][j] → 配列
    • list.get(i).get(j) → ArrayList
  2. nullに注意
    ArrayListを宣言しただけでは内部のリストは作られません。
    初期化を忘れると NullPointerException になります。
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
// list.get(0).add(1); // ここでエラー(中のリストがまだ存在しない)

  1. 性能面の違い
    • 配列:処理が軽い
    • ArrayList:柔軟だがメモリと速度のコストがかかる

まとめ

  • Javaの2次元配列は固定長、ArrayListを使えば柔軟に管理できる。
  • ArrayList<ArrayList<T>> の形式で「リストのリスト」を作る。
  • 実務では表形式データやサイズ可変のデータ管理に便利。
  • 経験の浅い方は「初期化の仕方」「get() の使い方」「nullエラー」に注意。

どなたかのお役に立てば幸いです。
それではまたー!