arrays.deeptostring 是打印多维数组的正确方法,因其递归展开各层嵌套并格式化输出;而 arrays.tostring 仅适用于一维数组,对多维数组只显示元素对象哈希码。

Arrays.toString 本身不支持直接打印多维数组(如二维、三维数组),它只会输出外层数组的引用地址或简单元素,无法递归展开内层数组。要高效、清晰地打印多维数组,必须使用 Arrays.deepToString。
为什么 Arrays.toString 不适用于多维数组
对二维数组调用 Arrays.toString(arr),结果类似:[[I@1b6d3586, [I@4554617c]——这只是两个一维数组对象的哈希码,不是实际内容。
这是因为 toString() 在数组类型上默认返回 getClass().getName() + "@" + Integer.toHexString(hashCode()),而 Arrays.toString 只对**一维数组**做了特殊处理,逐个调用元素的 toString();但对二维数组,其“元素”是一维数组对象,仍走默认对象 toString 逻辑。
正确做法:用 Arrays.deepToString
Arrays.deepToString 会递归处理嵌套数组:遇到数组类型元素时,自动调用对应的 deepToString 或 toString,直到所有层级都展开为可读字符串。
- 支持任意维度:二维、三维甚至更高维数组均可直接传入
- 自动识别基本类型数组(
int[][]、String[][]等)和对象数组 - 输出格式清晰,带方括号和逗号分隔,符合直觉(例如
[[1, 2], [3, 4]])
实用示例代码
以下是一段可直接运行的对比示例:
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]]
// 三维数组同样适用
int[][][] cube = {{{1}, {2}}, {{3}, {4}}};
System.out.println(Arrays.deepToString(cube)); // [[[1], [2]], [[3], [4]]]
注意事项与小技巧
- 仅对数组对象有效,传入
null会抛NullPointerException,建议先判空 - 若需自定义格式(如换行缩进、无空格),
deepToString不支持,此时应手写递归遍历或借助 Jackson/Gson 等库序列化 - 性能足够好:内部使用 StringBuilder 和递归栈,对常规业务规模(千级元素以内)无感知开销
- 替代方案少:自己写递归易出错;
Arrays.asList(arr)对多维数组无效(因 arr 是对象,不是泛型数组)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











