Java数组打印应使用Arrays.toString()(一维)或Arrays.deepToString()(多维),避免直接打印地址;二者均安全处理null、支持基本类型,自定义对象需重写toString(),大数组或敏感数据场景需规避。

Java 数组直接打印只会显示类似 [Ljava.lang.String;@1b6d3586 这样的内存地址,根本看不到内容。用 Arrays.toString() 是最快速、最可靠的一维数组可视化方式;多维数组则必须改用 Arrays.deepToString()。
一维数组:用 Arrays.toString() 直接格式化
它专为调试设计,自动处理基本类型(int[]、char[] 等)和引用类型(String[]、自定义对象数组),结果带方括号、逗号分隔,null 元素原样显示为 null。
-
int[] nums = {1, 0, -1}; System.out.println(Arrays.toString(nums));→[1, 0, -1] -
String[] arr = {"a", null, "c"}; System.out.println(Arrays.toString(arr));→[a, null, c] - 必须显式导入:
import java.util.Arrays;,否则编译报错 - 传入
null会抛NullPointerException,建议先判空:arr == null ? "null" : Arrays.toString(arr)
多维数组:Arrays.deepToString() 才能真正展开
Arrays.toString() 对二维及以上数组只显示子数组的引用地址,完全无法反映结构。只有 deepToString() 会递归调用每一层的 toString(),还原嵌套关系。
-
int[][] mat = {{1,2}, {3,4,5}};System.out.println(Arrays.toString(mat));→[[I@xxx, [I@yyy](不可读)System.out.println(Arrays.deepToString(mat));→[[1, 2], [3, 4, 5]](清晰) - 支持任意维度,包括
Object[][][]或混合类型(如Object[]{new int[]{1}, "hello"}) - 同样安全处理
null元素,但若自定义类未重写toString(),内部仍显示哈希值
调试实战技巧:让日志更有效
光会调用还不够,结合上下文和边界情况才能真正提升排查效率。
立即学习“Java免费学习笔记(深入)”;
- 加变量名前缀:
System.out.println("configKeys = " + Arrays.toString(configKeys));,避免日志里一堆[...]不知所云 - 大数组防刷屏:
Arrays.toString(Arrays.copyOf(arr, Math.min(10, arr.length)))只打前 10 个 - IDE 断点时,在 Evaluate Expression 面板直接输入
Arrays.deepToString(data),无需改代码就能实时查看 - 配合条件断点使用,比如设断点条件为
arr != null && arr.length > 0,再执行 deepToString,避免空指针或无效数据干扰
什么时候不该用 Arrays.toString?
它不是万能方案,明确适用边界才能避免误用。
- 含敏感数据(密码、token)——直接打印有泄露风险,应脱敏或跳过
- 超大数组(百万级)——字符串拼接耗内存、卡线程,建议只查片段或用其他分析工具
- 需要标准结构化输出(如 API 返回 JSON)——应走 Jackson/Gson 序列化,而非硬拼字符串
- 验证逻辑正确性——单元测试中优先用
assertArrayEquals(),而不是靠肉眼比对打印结果


















