では「配列の中に List / List の中に配列」も含めて、多次元・ネスト構造の ASCII 図で視覚化 します。これで配列と List の挙動の違いが一目で分かるようになります。
1. ネスト構造の例
import java.util.Arrays;
import java.util.List;
public class NestedDemo {
public static void main(String[] args) {
// 配列の中に List
Object[] arrayWithList = { Arrays.asList(1,2), Arrays.asList(3,4) };
// List の中に配列
List<Object> listWithArray = Arrays.asList(new int[]{5,6}, new int[]{7,8});
System.out.println("配列の中に List:");
System.out.println("println: " + arrayWithList);
System.out.println("toString: " + Arrays.toString(arrayWithList));
System.out.println("deepToString: " + Arrays.deepToString(arrayWithList));
System.out.println();
System.out.println("List の中に配列:");
System.out.println("println: " + listWithArray);
}
}
Java2. ASCII 図で構造を可視化
配列の中に List
arrayWithList: [ list0 , list1 ]
| |
v v
list0: [1, 2]
list1: [3, 4]
出力の違い:
| メソッド | 出力例 |
|---|---|
| println(arrayWithList) | [Ljava.lang.Object;@15db9742 ← 参照のみ |
| Arrays.toString(arrayWithList) | [ [1, 2], [3, 4] ] ← List の toString が呼ばれるので中身表示 |
| Arrays.deepToString(arrayWithList) | [ [1, 2], [3, 4] ] ← 深さ展開して表示(1次元 List も展開) |
※ 配列の中に List は deepToString を使うとさらに安全に全階層展開できる
List の中に配列
listWithArray: [ arr0 , arr1 ]
| |
v v
arr0: [5,6]
arr1: [7,8]
出力:
println(listWithArray): [[I@6d06d69c, [I@7852e922]
解説:
- List は println すると内部の toString を呼ぶ
- 配列は Object のままなので参照が表示される
- List 内の配列を中身まで表示したい場合は ループで個別に
Arrays.toStringする か、streamで map してtoStringを使う必要がある
3. 部分展開・中身確認のテクニック
List 内配列を中身表示(1行で展開)
listWithArray.stream()
.map(o -> Arrays.toString((int[])o))
.forEach(System.out::println);
Java出力:
[5, 6]
[7, 8]
4. 図で比較まとめ
┌──────────────────────────────┐
│ 配列の中に List │
│ arrayWithList: [list0, list1] │
│ println → 参照のみ │
│ toString → [[1,2],[3,4]] │
│ deepToString → [[1,2],[3,4]] │
└──────────────────────────────┘
┌──────────────────────────────┐
│ List の中に配列 │
│ listWithArray: [arr0, arr1] │
│ println → [[I@..., [I@...] ] │
│ deepToString → (Listには未対応) │
│ 個別に toString で中身表示 │
└──────────────────────────────┘
💡 ポイントまとめ
- 配列の中に List →
deepToStringで階層展開可能 - List の中に配列 → println は配列参照になるだけ。中身表示は個別に
Arrays.toStringを呼ぶ - 多次元・ネスト構造は ASCII 図で把握すると頭に入る
- 部分表示や null を組み合わせるとデバッグしやすい
