Java | null や部分表示、配列と List の比較などを ASCII 図で視覚化

Java Java
スポンサーリンク

では「配列の中に 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);
    }
}
Java

2. 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 で中身表示                           │
└──────────────────────────────┘

💡 ポイントまとめ

  1. 配列の中に List → deepToString で階層展開可能
  2. List の中に配列 → println は配列参照になるだけ。中身表示は個別に Arrays.toString を呼ぶ
  3. 多次元・ネスト構造は ASCII 図で把握すると頭に入る
  4. 部分表示や null を組み合わせるとデバッグしやすい
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました