应使用 Arrays.deepToString() 打印多维数组,因其递归展开各层元素并生成结构清晰的字符串;Arrays.toString() 仅对一维数组有效,对多维数组会显示不可读的哈希码。

直接用 Arrays.deepToString() 就行,这是专为多维数组设计的打印方法,一调就出结构清晰的结果;别用 Arrays.toString() 或直接打印数组变量,那只会看到类似 [[I@1b6d3586 的哈希值,完全看不出内容。
为什么 Arrays.toString 不适合多维数组
Arrays.toString() 只对一维数组做了特殊处理:它会逐个调用每个元素的 toString() 并拼接。但二维数组的“元素”是一维数组对象,而数组对象默认的 toString() 返回的是类名加哈希码(比如 [I@xxxx),所以结果就是一堆不可读的地址。
- 例如:
int[][] arr = {{1,2},{3,4}}; -
Arrays.toString(arr)输出:[[I@..., [I@...] - 这不是 bug,是设计如此——它本就不承诺处理嵌套
Arrays.deepToString 的正确用法
这个方法会递归检查每个元素:遇到普通对象就调用其 toString(),遇到数组就继续调用对应维度的 deepToString,直到所有层级都展开为字符串。
- 支持任意维度:二维、三维、甚至
Object[]里混着int[]和String[] - 输出格式直观:
[[1, 2], [3, 4]]、[[[1], [2]], [[3], [4]]] - 基本类型数组(
int[][])、引用类型数组(String[][])、混合型(Object[])全都能识别
实用注意事项和避坑点
用起来简单,但几个细节不注意容易报错或效果不对:
- 传入
null会直接抛NullPointerException,建议打印前先判空:if (arr != null) System.out.println(Arrays.deepToString(arr)); - 它不支持自定义格式,比如换行缩进、去掉空格、添加前缀等;有这类需求就得手写递归或用 Jackson/Gson 序列化
- 性能足够日常使用:内部用
StringBuilder累加,递归深度在常规业务中(几千元素以内)无明显开销 -
Arrays.asList(arr)对多维数组无效——因为arr是个对象,不是泛型数组,转出来只是单个元素的列表
对比示例代码片段
下面这段可以直接运行,一眼看出差别:
int[][] matrix = {{1, 2}, {3, 4}, {5, 6}};
System.out.println(Arrays.toString(matrix)); // [[I@..., [I@..., [I@...]
System.out.println(Arrays.deepToString(matrix)); // [[1, 2], [3, 4], [5, 6]]
String[][] grid = {{"a","b"}, {"c","d"}};
System.out.println(Arrays.deepToString(grid)); // [[a, b], [c, d]]


















