お疲れ様です。はるさらと申します。
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を選ぶと良いです。
間違えやすいポイント
- インデックス指定の違いを理解する
array[i][j]→ 配列list.get(i).get(j)→ ArrayList
- nullに注意
ArrayListを宣言しただけでは内部のリストは作られません。
初期化を忘れるとNullPointerExceptionになります。
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
// list.get(0).add(1); // ここでエラー(中のリストがまだ存在しない)
- 性能面の違い
- 配列:処理が軽い
- ArrayList:柔軟だがメモリと速度のコストがかかる
まとめ
- Javaの2次元配列は固定長、ArrayListを使えば柔軟に管理できる。
ArrayList<ArrayList<T>>の形式で「リストのリスト」を作る。- 実務では表形式データやサイズ可変のデータ管理に便利。
- 経験の浅い方は「初期化の仕方」「get() の使い方」「nullエラー」に注意。
どなたかのお役に立てば幸いです。
それではまたー!





































