Java | 図(ASCII 図)で println → toString → deepToString の違いを視覚化

Java Java
スポンサーリンク

視覚でぱっと分かるように ASCII 図 を使って println(array)Arrays.toString(array)Arrays.deepToString(array) の違いをまとめます。各段階で「配列の構造」と「実際に出力される文字列」を対応させて示します。コピペで使えるコード例も付けます。

1. 前提:配列の構造イメージ(視覚化の記号)

  • [] = 配列(コンテナ)
  • = 参照(配列オブジェクトが別のメモリ位置を指す)
  • val = 実際の値(数値や文字列)
  • REF = println によって出る参照表現(例: [I@372f7a8d

2. 1次元配列(int[] a = {1,2,3})

配列の内部イメージ:

a: [ 1 , 2 , 3 ]
     ^   ^   ^
    val val val

出力の違い:

  • System.out.println(a);
→ REF
(例表示): [I@372f7a8d
  • System.out.println(Arrays.toString(a));
→ [1, 2, 3]
  • System.out.println(Arrays.deepToString(a));
→ [1, 2, 3]   <-- 1次元では toString と同様(deep でも同じ)

3. 2次元配列(int[][] b = {{10,20},{30,40}})

実際のメモリ/構造イメージ:

b: [ row0 , row1 ]
     |        |
     v        v
  row0: [10, 20]
  row1: [30, 40]

出力の違い(重要):

  • System.out.println(b);
→ REF
(例): [[I@6d06d69c

(配列オブジェクト b 自体の参照が出る)

  • System.out.println(Arrays.toString(b));
→ [ REF_row0 , REF_row1 ]
(例): [[I@6d06d69c, [I@7852e922]

toString は b の要素(row0,row1)が「配列オブジェクト」だと認識して参照を並べるだけ)

  • System.out.println(Arrays.deepToString(b));
→ [[10, 20], [30, 40]]

deepToString が内側の配列まで再帰的に展開して中身を表示)


4. 3次元配列イメージ(int[][][] c = { {{1,2},{3,4}}, {{5,6},{7,8}} })

構造:

c: [ slab0 , slab1 ]
     |         |
     v         v
slab0: [ row00, row01 ]   // row00: [1,2], row01: [3,4]
slab1: [ row10, row11 ]   // row10: [5,6], row11: [7,8]

出力:

  • println(c) → REF(c の参照)
  • Arrays.toString(c)[ REF_slab0, REF_slab1 ](各 slab の参照)
  • Arrays.deepToString(c)[[[1, 2], [3, 4]], [[5, 6], [7, 8]]](全階層展開)

5. 一覧表(簡潔まとめ)

構造println(array)Arrays.toString(array)Arrays.deepToString(array)
1次元REF(例 [I@...[v1, v2, ...][v1, v2, ...]
2次元REF(例 [I@...[REF_row0, REF_row1][[...], [...]](中身展開)
3次元以上REF[REF_slab0, REF_slab1][[[...]], [[...]]](再帰展開)

6. コピペで動く確認コード

import java.util.Arrays;

public class PrintDemo {
    public static void main(String[] args) {
        int[] one = {1,2,3};
        int[][] two = {{10,20},{30,40}};
        int[][][] three = {
            { {1,2}, {3,4} },
            { {5,6}, {7,8} }
        };

        System.out.println("println(one): " + one);
        System.out.println("toString(one): " + Arrays.toString(one));
        System.out.println();

        System.out.println("println(two): " + two);
        System.out.println("toString(two): " + Arrays.toString(two));
        System.out.println("deepToString(two): " + Arrays.deepToString(two));
        System.out.println();

        System.out.println("println(three): " + three);
        System.out.println("toString(three): " + Arrays.toString(three));
        System.out.println("deepToString(three): " + Arrays.deepToString(three));
    }
}
Java

期待する出力の例(説明用):

println(one): [I@15db9742
toString(one): [1, 2, 3]

println(two): [[I@6d06d69c
toString(two): [[I@6d06d69c, [I@7852e922]
deepToString(two): [[10, 20], [30, 40]]

println(three): [[[I@4e25154f
toString(three): [[[I@4e25154f, [[I@70dea4e]
deepToString(three): [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

7. 補足メモ(初心者が間違えやすいところ)

  • Arrays.toString は「配列の要素をカンマ区切りで並べる」のが仕事。要素がさらに配列なら 参照を並べるだけ
  • Arrays.deepToString は「要素が配列なら中身も展開する」ので多次元配列に最適。
  • ログに全部出すと長くなるので、デバッグ時は必要な階層だけ出す/先頭 N 個だけ出すなど工夫する。

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました