視覚でぱっと分かるように 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 個だけ出すなど工夫する。
