分かりやすく、初心者が読みながら実際に手を動かせるように、Arrays.toString と Arrays.deepToString の仕組みを丁寧に、例題(実行結果付き)+練習問題(解答付き)で説明します。すぐコピペで動く完全な main プログラムも入れます。
概要(かんたん結論)
System.out.println(array);は配列の「中身」ではなく 参照(オブジェクト識別子) を表示する →[I@372f7a8dのように見える。- 1次元配列(
int[],String[]など)はArrays.toString(array)で中身を[x, y, z]の形で表示できる。 - 多次元配列(配列の中に配列がある場合)は
Arrays.deepToString(array)を使うとネストされた全要素を展開して表示してくれる。
1. なぜ println(array) がダメなのか(初心者向けの直感)
Java の配列は「オブジェクト」として扱われます。println はオブジェクトの toString() を呼び出しますが、配列クラスはデフォルトの toString() をオーバーライドしていないため、クラス名+ハッシュコードのような参照が表示されます。
→ 結果として「配列の中身(値)」が見えない。
2. 1次元配列の表示:Arrays.toString
サンプル(実行できるプログラム)
import java.util.Arrays;
public class ToString1D {
public static void main(String[] args) {
int[] a = {1, 2, 3};
System.out.println(a); // 参照が出る(NG)
System.out.println(Arrays.toString(a)); // [1, 2, 3](OK)
String[] fruits = {"apple", "banana", "orange"};
System.out.println(Arrays.toString(fruits)); // [apple, banana, orange]
}
}
Java解説
Arrays.toStringは 1次元配列専用 の見やすい文字列を返します。- デバッグで値を確認したいときにまず使うメソッドです。
3. 2次元以上(多次元):Arrays.deepToString
問題になる例
import java.util.Arrays;
public class ToString2D {
public static void main(String[] args) {
int[][] b = { {10, 20}, {30, 40} };
System.out.println(Arrays.toString(b)); // 参照の配列が出る(NG)
System.out.println(Arrays.deepToString(b)); // [[10, 20], [30, 40]](OK)
}
}
Java解説
Arrays.toStringを2次元配列に使うと、内側の配列({10,20})がオブジェクト参照として表示されてしまいます。Arrays.deepToStringは ネストされた全ての配列を再帰的に展開してくれるので、2次元・3次元…の全要素を人が読める形で表示できます。
4. 行ごとの丁寧な説明(1行ずつ何が起きるか)
例:
int[][] b = { {10, 20}, {30, 40} };
System.out.println(Arrays.toString(b));
JavaArrays.toString(b)はbの**要素(= 各行の配列)**をtoString形式で並べただけなので、各行が"[I@xxxxxx"のように参照で表示される。
System.out.println(Arrays.deepToString(b));
JavadeepToStringは要素が配列ならその中身をさらに展開して文字列化する →[[10, 20], [30, 40]]
5. 実務での注意点(初心者がやりがちなこと)
- ログで巨大な配列を全部
deepToStringするとログが長大になり可読性が落ちる → 一部だけ表示する(最初の N 個)などにする。 - 配列が
nullの可能性がある場合はArrays.toString/deepToStringに渡す前にnullチェックをする(Arrays.toString(null)はnullを引数にとるオーバーロードがないのでNullPointerExceptionになる)。→ 実際にはArrays.toStringに null を渡すと NPE になります。(Objects.toString(obj)など別の方法で安全に扱うことも検討)
6. すぐ使えるコピペ用:大小サンプル(1D / 2D / 3D)
import java.util.Arrays;
public class ArrayPrintSamples {
public static void main(String[] args) {
int[] one = {1,2,3};
int[][] two = {{1,2},{3,4}};
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("toString(two): " + Arrays.toString(two));
System.out.println("deepToString(two): " + Arrays.deepToString(two));
System.out.println("deepToString(three): " + Arrays.deepToString(three));
}
}
Java期待出力(例)
println(one): [I@15db9742
toString(one): [1, 2, 3]
toString(two): [[I@6d06d69c, [I@7852e922]
deepToString(two): [[1, 2], [3, 4]]
deepToString(three): [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
7. 練習問題(手を動かして理解する) — 解答付き
問題1(基礎)
次の配列 numbers の中身を表示したい。println を使うと参照が出てしまう。正しい出力にするためにコードを完成させよ。
int[] numbers = {5, 10, 15, 20};
// ここに1行書いて中身を出力する(例: [5, 10, 15, 20])
Java解答
System.out.println(java.util.Arrays.toString(numbers));
Java(import java.util.Arrays; を上に書いておけば Arrays.toString(numbers) で良い)
問題2(応用)
次の 2 次元配列 matrix のすべての値を見やすく出力せよ。
int[][] matrix = {
{2, 4, 6},
{8, 10, 12}
};
Java解答
System.out.println(java.util.Arrays.deepToString(matrix));
Java問題3(考察)
文字列配列 words を Arrays.toString(words) で出力するときと、Arrays.deepToString(words) で出力するときの違いは?
String[] words = {"hi", "hello"};
Java解答(解説)
wordsは 1 次元配列なのでtoStringだけで[hi, hello]と出る。deepToStringを使っても同じ結果になる(deepToStringはネストがあれば展開するが、1次元なら結果は同じ)。
8. さらに一歩(実務での便利ワザ)
- ログ出力用のユーティリティを作る:
public static String nicePrint(Object array) {
if (array == null) return "null";
if (array.getClass().isArray()) {
// 配列の次元を判定して deepToString と toString を切り替える(簡易実装)
return Arrays.deepToString(new Object[]{array}).replaceFirst("^\\[", "").replaceFirst("\\]$", "");
}
return array.toString();
}
Java(※ これは例。実務ではライブラリやより堅牢な実装を使うことを推奨)
9. よくある質問(FAQ)
- Q
- A
多次元配列が登場する可能性がないなら
toStringで十分。deepToStringは便利だが大きな配列だと長い文字列になるので注意。
- Q
nullが渡ったら? - A
Arrays.toString(null)はNullPointerExceptionを投げます。呼び出す前にnullチェックを入れるか、Objects.toString(obj, "null")等で安全に扱ってください。
