arrays.deeptostring 是 java 中递归展开多维数组及嵌套对象(如数组、集合)的工具方法,适用于二维及以上基本类型数组、含数组的对象数组、嵌套 list 或重写 tostring() 的自定义对象;对未重写 tostring() 的自定义对象仅显示默认哈希码,不深入字段;支持 map/set 但仅调用其 tostring();空数组或 null 安全输出,但不支持循环引用、无格式化能力,性能敏感场景需谨慎使用。

Arrays.deepToString 是 Java 中专门用于打印多维数组或包含嵌套对象(如数组、集合、自定义对象)的数组的工具方法,它能递归展开每一层结构,避免直接调用 toString() 时只显示内存地址(如 [Ljava.lang.Object;@1b6d3586)的问题。
适用于哪些嵌套数组场景
该方法对以下结构特别有用:
- 二维及以上基本类型数组(
int[][]、String[][]) - 对象数组中包含其他数组(
Object[] arr = {new int[]{1,2}, new String[]{"a","b"}};) - 嵌套 List 或自定义对象(前提是这些对象已重写
toString()) - 混合类型数组(如同时含 Integer、String[]、ArrayList)
基本用法与对比示例
直接看代码差异:
错误方式(只输出哈希码):Object[] mixed = {1, new int[]{2, 3}, Arrays.asList("x", "y")};
System.out.println(mixed); // [Ljava.lang.Object;@xxxxxx
正确方式(递归展开):
System.out.println(Arrays.deepToString(mixed)); // 输出:[1, [2, 3], [x, y]]
注意:如果数组元素是未重写 toString() 的自定义对象,deepToString 仍会调用其默认 toString(),所以建议这类对象也实现友好输出。
处理自定义对象嵌套的注意事项
当数组里有自定义类实例时,deepToString 不会“深入”到对象字段内部,它只负责递归处理数组和集合类型。例如:
class Person {
String name;
int age;
// 未重写 toString() → 输出 Person@xxxx
}
Object[] data = {new Person(), new String[]{"Alice", "Bob"}};
此时输出类似:[Person@3d8e6079, [Alice, Bob]]
- 要让
Person也清晰显示,必须重写toString()方法 -
deepToString对 Map、Set 等集合类型也有效,但只调用其toString(),不额外展开 - 空数组或 null 元素会被表示为
null或[],不会抛异常
替代方案与局限性
虽然 deepToString 简单易用,但也有边界:
- 不支持循环引用(比如 A 数组里包含 B,B 又引用 A),会抛
StackOverflowError - 无法控制缩进、换行或字段过滤,不适合日志格式化等高级需求
- 若需 JSON 风格输出,建议用 Jackson 或 Gson 的
writeValueAsString() - 对性能敏感的大数组,频繁调用可能影响效率,调试时用即可











