直接打印 Java 數組引用只會輸出類似 [I@15db9742 的內存地址,毫無業務意義。本文對比傳統循環打印與 Arrays.toString/deepToString 的優劣,詳細說明一維、多維、異構數組的正確輸出姿勢。
int[] arr = {1, 2, 3};
System.out.print("[");
for (int i = 0; i < arr.length - 1; i++) {
System.out.print(arr[i] + ", ");
}
System.out.println(arr[arr.length - 1] + "]");
// 輸出: [1, 2, 3]
缺點:代碼冗長、易出界、多維數組需遞歸處理。
import java.util.Arrays;
int[] arr = {1, 2, 3};
System.out.println(Arrays.toString(arr));
// 輸出: [1, 2, 3]
String[] strs = {"aaa", "bbb"};
System.out.println(Arrays.toString(strs));
// 輸出: [aaa, bbb]
優點:簡潔、自動處理 null 元素、格式統一。
int[] arr = {1, 2, 3};
String[] strs = {"aaa", "bbb"};
Object[] mixed = {arr, strs};
System.out.println(Arrays.toString(mixed));
// 輸出: [[I@15db9742, [Ljava.lang.String;@6d06d69c] <-- 內存地址,不可讀
System.out.println(Arrays.deepToString(mixed));
// 輸出: [[1, 2, 3], [aaa, bbb]] <-- 完美遞歸展開
toString 僅調用數組對象的 Object.toString(),返回類名 + @ + 哈希碼。deepToString 內部遞歸檢測元素是否為數組 (componentType.isArray()),若是則繼續調用 deepToString,否則調用 String.valueOf()。int[][][]、Object[][][] 均可正確展開。toString(),否則 deepToString 仍會輸出默認地址。deepToString 內部維護 IdentityHashMap 檢測循環引用,遇環輸出 "(this Collection)",避免棧溢出。int[][] matrix = {{1,2},{3,4}}; Arrays.deepToString(matrix) → [[1, 2], [3, 4]]。| 場景 | 推薦方法 | 示例輸出 |
|---|---|---|
| 基本類型一維數組 | Arrays.toString | [1, 2, 3] |
| 引用類型一維數組 | Arrays.toString | [aaa, bbb] |
| 二維/多維數組 | Arrays.deepToString | [[1, 2], [3, 4]] |
| 異構數組 (Object[]) | Arrays.deepToString | [[1, 2, 3], [aaa, bbb]] |
| 集合 | Collection.toString() | [1, 2, 3] (內部調用 Arrays.toString) |
拋棄手動循環,擁抱 Arrays.toString 與 deepToString。一行代碼解決 99% 的數組調試輸出需求,代碼更乾淨、可讀性更強、遞歸處理更可靠。記住:一維用 toString,多維/異構用 deepToString,調試效率提升立竿見影。