Java | 配列の文字列表示

Java Java
スポンサーリンク

分かりやすく、初心者が読みながら実際に手を動かせるように、Arrays.toStringArrays.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.toString1次元配列専用 の見やすい文字列を返します。
  • デバッグで値を確認したいときにまず使うメソッドです。

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));
Java
  • Arrays.toString(b)b の**要素(= 各行の配列)**を toString 形式で並べただけなので、各行が "[I@xxxxxx" のように参照で表示される。
System.out.println(Arrays.deepToString(b));
Java
  • deepToString は要素が配列ならその中身をさらに展開して文字列化する → [[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(考察)

文字列配列 wordsArrays.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") 等で安全に扱ってください。

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