首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 數組優雅輸出:Arrays.toString 與 deepToString 完全指南

     編輯:Java 相關知識

前言

直接打印 Java 數組引用只會輸出類似 [I@15db9742 的內存地址,毫無業務意義。本文對比傳統循環打印與 Arrays.toString/deepToString 的優劣,詳細說明一維、多維、異構數組的正確輸出姿勢。

三種打印方式對比

1. 手動循環 (不推薦)

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]

缺點:代碼冗長、易出界、多維數組需遞歸處理。

2. Arrays.toString (一維數組首選)

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 元素、格式統一。

3. Arrays.deepToString (多維/異構數組必備)

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]]  <-- 完美遞歸展開

深度解析:為什麼需要 deepToString?

  • toString 僅調用數組對象的 Object.toString(),返回類名 + @ + 哈希碼。
  • deepToString 內部遞歸檢測元素是否為數組 (componentType.isArray()),若是則繼續調用 deepToString,否則調用 String.valueOf()。
  • 支援任意嵌套深度:int[][][]、Object[][][] 均可正確展開。

進階用法與注意事項

  1. 自定義對象數組:確保實體類重寫 toString(),否則 deepToString 仍會輸出默認地址。
  2. 循環引用風險:JDK 8+ deepToString 內部維護 IdentityHashMap 檢測循環引用,遇環輸出 "(this Collection)",避免棧溢出。
  3. 性能考量:大數組 (超過 10 萬元素) 打印會產生巨大字符串,建議僅調試時使用,生產環境慎用或限制長度。
  4. 基本類型二維數組: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,調試效率提升立竿見影。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved