Arrays.deepToString 专用于递归打印嵌套数组结构,如 int[][]、Object[]{int[], String[]} 等;不适用纯自定义对象或非数组集合,误用会导致编译错误或无效输出。

用 Arrays.deepToString 打印嵌套数组,关键在于它能递归展开多维数组和含数组的对象字段,避免 toString() 返回无意义的哈希码。
适用于哪些“复杂结构”
该方法专为含嵌套数组的结构设计,比如:
- 二维及以上原始类型数组(
int[][]、String[][][]) - 对象数组中包含数组字段(如
Object[]里存了int[]或自定义类实例,且该类字段含数组) - 混合结构:如
Object[]{new int[]{1,2}, "hello", new String[]{"a","b"}}
注意:对纯自定义对象(未重写 toString 且不含数组字段),仍会显示类名+哈希码,deepToString 不会自动反射解析其内部普通字段。
常见误用与正确写法
直接传入非数组对象会报错;传入单层数组又用不到“deep”。典型错误:
-
错误:
Arrays.deepToString("abc")—— 字符串不是数组,编译不通过 -
低效:
Arrays.deepToString(new int[]{1,2,3})—— 单维数组用Arrays.toString更合适 -
正确:
Arrays.deepToString(new int[][]{{1,2},{3,4,5}})→[[1, 2], [3, 4, 5]] -
正确:
Arrays.deepToString(new Object[]{new int[]{1}, Arrays.asList(2,3)})→[[1], [2, 3]](asList返回的是List,不是数组,但整体仍在 Object[] 中)
配合调试的实际技巧
在排查数据初始化或 JSON 解析后结构时,可快速确认嵌套层级是否符合预期:
- 打印前先检查是否为
null,否则抛NullPointerException - 对含
null元素的数组,deepToString会显示null字符串,便于定位空值位置 - 若输出仍是类似
[Ljava.lang.Object;@1f32edb8,说明传入的是普通对象而非数组——请检查变量类型和初始化方式 - 与日志结合时建议加标签:
log.debug("data matrix: {}", Arrays.deepToString(matrix));
替代方案与局限提醒
当结构更复杂(如含循环引用、大量数据、非数组集合嵌套),deepToString 就力不从心了:
- 不处理
Collection、Map等接口类型,只认数组类型 - 遇到自定义类中的数组字段,不会自动展开(除非该类被包装在
Object[]中且字段本身是数组) - 大数组可能生成超长字符串,影响日志性能或可读性
- 需要深度格式化时,可考虑 Jackson 的
ObjectMapper.writeValueAsString或 Gson

















