初心者〜中級者が実際に手を動かして学べるよう、練習問題 10 問+模範解答(動くコード例+出力例+短い解説) を作りました。順にやれば Arrays.toString / Arrays.deepToString の理解はバッチリになります。コピペして動かせるように、各問に「解答コード」を書いてあります。
問題1(基礎)
問題:int[] nums = {5, 10, 15}; の中身を [5, 10, 15] の形式で出力してください。
ポイント:そのまま System.out.println(nums) としないこと。
解答
import java.util.Arrays;
public class Q1 {
public static void main(String[] args) {
int[] nums = {5, 10, 15};
System.out.println(Arrays.toString(nums));
}
}
Java期待出力
[5, 10, 15]
解説:1次元配列は Arrays.toString を使う。
問題2(多次元)
問題:次の 2 次元配列 matrix を [[1, 2], [3, 4]] の形式で出力してください。
int[][] matrix = {{1,2},{3,4}};
Java解答
import java.util.Arrays;
public class Q2 {
public static void main(String[] args) {
int[][] matrix = {{1,2},{3,4}};
System.out.println(Arrays.deepToString(matrix));
}
}
Java期待出力
[[1, 2], [3, 4]]
解説:2次元以上は deepToString を使うとネストが展開される。
問題3(toString と deepToString の違いを確認)
問題:次のコードの出力を予想してください(実行例を示す)。
String[] words = {"a","b"};
String[][] pairs = {{"a","b"},{"c","d"}};
System.out.println(Arrays.toString(words));
System.out.println(Arrays.toString(pairs));
System.out.println(Arrays.deepToString(pairs));
Java解答(出力)
[a, b]
[[Ljava.lang.String;@xxxxxxx, [Ljava.lang.String;@yyyyyyy]
[[a, b], [c, d]]
解説:pairs に Arrays.toString を使うと内側の配列が参照表示になる。deepToString で展開される。
問題4(空配列)
問題:空の int[](new int[0])を表示したときの出力は何か?実際に出力して確認してください。
解答
import java.util.Arrays;
public class Q4 {
public static void main(String[] args) {
int[] empty = new int[0];
System.out.println(Arrays.toString(empty));
}
}
Java期待出力
[]
解説:空配列は [] と表示される。
問題5(null の扱い)
問題:int[] arr = null; の場合に Arrays.toString(arr) を呼ぶとどうなるか?安全に「null」表示にしたい場合のコードも示してください。
解答(安全に表示する例)
import java.util.Arrays;
public class Q5 {
public static void main(String[] args) {
int[] arr = null;
// 直接呼ぶと NullPointerException になる(回避例)
System.out.println(arr == null ? "null" : Arrays.toString(arr));
}
}
Java期待出力
null
解説:Arrays.toString(null) は NPE になる。呼ぶ前に null チェックをする。
問題6(不揃い(ジャグ)配列)
問題:ジャグ配列(行ごとに長さが異なる)を deepToString で出力してみてください。
int[][] jagged = { {1}, {2,3,4}, {} };
Java解答
import java.util.Arrays;
public class Q6 {
public static void main(String[] args) {
int[][] jagged = { {1}, {2,3,4}, {} };
System.out.println(Arrays.deepToString(jagged));
}
}
Java期待出力
[[1], [2, 3, 4], []]
解説:deepToString は行ごとの長さが違っても正しく展開する。
問題7(配列の一部だけ表示)
問題:大きな配列 int[] big = {1,2,3,4,5,6,7,8,9,10} の最初の 3 要素だけ [1, 2, 3] として表示するコードを書きなさい。
解答
import java.util.Arrays;
public class Q7 {
public static void main(String[] args) {
int[] big = {1,2,3,4,5,6,7,8,9,10};
int[] head = Arrays.copyOfRange(big, 0, 3); // 0〜2 をコピー
System.out.println(Arrays.toString(head));
}
}
Java期待出力
[1, 2, 3]
解説:Arrays.copyOfRange で部分配列を作ってから表示する。
問題8(オブジェクト配列と toString)
問題:次の Person クラス配列を Arrays.toString で出力したときに、人が読める文字列にするには Person に何を実装すべきか?コード例で示しなさい。
class Person {
String name;
Person(String n){ name=n; }
}
Person[] people = { new Person("Alice"), new Person("Bob") };
System.out.println(Arrays.toString(people));
Java解答
import java.util.Arrays;
class Person {
String name;
Person(String n){ name=n; }
@Override
public String toString(){ return "Person(" + name + ")"; }
}
public class Q8 {
public static void main(String[] args) {
Person[] people = { new Person("Alice"), new Person("Bob") };
System.out.println(Arrays.toString(people));
}
}
Java期待出力
[Person(Alice), Person(Bob)]
解説:オブジェクト配列は各要素の toString() を呼ぶ。分かりやすくするにはクラスで toString をオーバーライドする。
問題9(1次元配列に deepToString を使うと…)
問題:int[] a = {1}; に対して Arrays.deepToString(a) をそのまま呼べるか?(呼べる or コンパイルエラー or 実行時例外)理由も答えよ。
解答
回答:Arrays.deepToString(a) を直接呼すと コンパイルエラー(引数型不一致) になる場合がある。
解説:deepToString のシグネチャは public static String deepToString(Object[] a)(配列の配列など Object[])を想定している実装が多い(内部的に instanceof を使うため扱いが異なる)。1次元の基本型配列(int[])は Object ではあるが Object[] ではないため注意が必要。1次元なら Arrays.toString を使うのが正解。
実際の JDK 実装ではオーバーロードなどで対応される事もあるが、安定して使うには
toStringを選ぶのが無難。
問題10(実践:配列を安全にログ出力するユーティリティを作る)
問題:任意の配列(null もあり得る、1次元〜多次元)を受け取って「安全に」文字列化して返すメソッド safeArrayToString(Object obj) を実装しなさい。(ヒント:obj == null のチェック、obj.getClass().isArray()、Arrays.deepToString の活用)
解答例
import java.util.Arrays;
public class Q10 {
public static void main(String[] args) {
int[] one = {1,2,3};
int[][] two = {{1,2},{3,4}};
Object nothing = null;
System.out.println(safeArrayToString(one)); // [1, 2, 3]
System.out.println(safeArrayToString(two)); // [[1, 2], [3, 4]]
System.out.println(safeArrayToString(nothing)); // null
System.out.println(safeArrayToString("hello")); // hello (非配列は toString)
}
public static String safeArrayToString(Object obj) {
if (obj == null) return "null";
Class<?> cls = obj.getClass();
if (!cls.isArray()) {
return obj.toString();
}
// 配列である。プリミティブ配列も deepToString に渡して扱う(ラップ)
if (obj instanceof Object[]) {
return Arrays.deepToString((Object[]) obj);
} else {
// 基本型配列(int[], double[] ...)は Arrays.toString のオーバーロードで処理
if (obj instanceof int[]) return Arrays.toString((int[]) obj);
if (obj instanceof long[]) return Arrays.toString((long[]) obj);
if (obj instanceof double[]) return Arrays.toString((double[]) obj);
if (obj instanceof float[]) return Arrays.toString((float[]) obj);
if (obj instanceof boolean[])return Arrays.toString((boolean[]) obj);
if (obj instanceof char[]) return Arrays.toString((char[]) obj);
if (obj instanceof byte[]) return Arrays.toString((byte[]) obj);
if (obj instanceof short[]) return Arrays.toString((short[]) obj);
// 万が一他の型があれば fallback
return Arrays.deepToString(new Object[]{obj});
}
}
}
Java期待出力(例)
[1, 2, 3]
[[1, 2], [3, 4]]
null
hello
解説:isArray() で配列判定し、Object[] とプリミティブ配列を分けて安全に処理している。
