Arrays.toString() 是调试 Java 一维数组的首选方法,能将数组转为可读字符串格式如[1, 2, 3],而直接打印仅输出哈希值;多维数组需用 Arrays.deepToString() 递归展开;使用时须判空避免 NullPointerException。

调试 Java 数组时,直接打印 array 对象只会输出类似 [Ljava.lang.String;@1b6d3586 的哈希值,毫无可读性。用 Arrays.toString() 是最轻量、最常用、也最容易被忽略的调试利器——它能把一维数组转成清晰易读的字符串格式,省去手写循环或依赖 IDE 变量视图的麻烦。
为什么 Arrays.toString 比 System.out.println(array) 强?
Java 中数组是对象,但没重写 toString() 方法,所以默认调用的是父类 Object.toString(),结果就是类名加哈希码。而 Arrays.toString() 内部做了适配:对基本类型和引用类型分别处理,自动加方括号、逗号分隔、null 显示为 null,语义清晰且零配置。
- 对于
int[] arr = {1, 2, 3};,System.out.println(arr)输出[I@4554617c;Arrays.toString(arr)输出[1, 2, 3] - 对于
String[] names = {"Alice", null, "Bob"};,输出为[Alice, null, Bob],直观反映真实数据状态
多维数组别硬套,用 Arrays.deepToString
一维数组用 Arrays.toString() 就够了,但二维及以上数组(比如 int[][])再用它,结果仍是不可读的地址值。这时必须换 Arrays.deepToString()——它会递归展开每一层,生成嵌套结构的字符串表示。
-
int[][] grid = {{1, 2}, {3, 4}};Arrays.toString(grid)→[[I@1b6d3586, [I@4554617c]Arrays.deepToString(grid)→[[1, 2], [3, 4]] - 支持任意嵌套深度,包括
Object[][][],无需手动遍历
调试时快速插入,不打断执行流
比起在 IDE 里反复点开变量树、或者临时加 for 循环,直接在关键位置插入一行 System.out.println(Arrays.toString(myArray)); 更快更直接。尤其适合快速验证方法返回值、入参内容或中间计算结果。
立即学习“Java免费学习笔记(深入)”;
- 在方法入口处打印参数:
log.debug("input: {}", Arrays.toString(nums)); - 在分支逻辑前后对比:
System.out.println("before sort: " + Arrays.toString(arr)); Arrays.sort(arr); System.out.println("after sort: " + Arrays.toString(arr)); - 配合断点使用:停在某行后,在 Debug Console 中直接输入
Arrays.toString(list.toArray())(注意需先确保 list 非空且已加载)
注意边界:null 数组要判空
Arrays.toString(null) 会抛出 NullPointerException,这点容易踩坑。实际调试中,入参或中间结果可能是 null,建议封装一层安全调用,或养成前置判断习惯。
- 简单防护:
System.out.println("data = " + (arr == null ? "null" : Arrays.toString(arr))); - 工具方法(可复用):public static String safeToString(Object[] arr) { return arr == null ? "null" : Arrays.toString(arr); }
- Stream 场景下常见 null 数组,如
strings.stream().toArray(String[]::new)在源 stream 为空时返回空数组(不是 null),但上游可能传入 null,仍需校验


















