arrays.deeptostring 通过类型检查递归展开多维数组:遇数组则再调用自身,遇非数组对象则调其 tostring(),null 输出字符串 "null";它不反射自定义对象字段,仅处理数组嵌套,与 arrays.tostring 的单层展开有本质区别。

Arrays.deepToString 的“递归”不是指你自己写递归函数,而是 Java 内部自动判断类型、逐层展开的机制:遇到数组就继续调用 deepToString,遇到非数组对象就调用它的 toString()。
它怎么知道该往哪一层走?
方法内部会做类型检查——如果当前元素是数组(无论 int[]、String[] 还是 Object[]),就再次调用 Arrays.deepToString;如果是普通对象(比如 String、Integer 或自定义类实例),就直接调用该对象的 toString() 方法。
- 对 int[][]:外层数组 → 每个元素是 int[] → 对每个 int[] 再调一次 deepToString → 展开成 [1, 2] 格式
- 对 Object[]:若其中某个元素是 String[],就递归处理这个 String[];若另一个元素是 "hello",就直接调用 "hello".toString()
- 遇到 null 时,不抛异常,原样输出字符串 "null"
为什么它不进自定义对象的字段里?
deepToString 只识别「参数本身是不是数组类型」,不反射、不读取对象内部字段。比如 Person 类有个 int[] scores 字段,你传入的是 Person[] 数组,那 deepToString 只会调 Person.toString(),不会自动去 toString(scores)。
使用 OpenAI Codex CLI 处理编码任务。触发词:codex、code review、fix CI、refactor code、implement feature、coding agent、gpt-5-codex。Clawdbot 可将编码工作委托给 Codex CLI 作为子代理或直接工具。
- 它只负责“数组套数组”的展开,不是通用序列化工具
- 想让 scores 显示内容,得在 Person.toString() 里手动写 Arrays.toString(scores)
- 这是设计使然,不是 bug —— 它专注解决多维数组可视化问题,边界清晰
和 Arrays.toString 的根本区别在哪?
Arrays.toString 是单层展开:把一维数组转成 [a, b, c];对二维数组,它把每个内层数组当普通对象,只能输出类似 [[I@xxx, [I@xxx] 这样的地址。
- toString() 不做类型判断,一律调元素的 toString()
- deepToString() 主动区分“数组”和“非数组”,前者递归,后者委托
- 所以二维及以上数组,必须用 deepToString 才能看到真实数据结构
实际调试中要注意什么?
它很省心,但也有几个现实细节影响输出效果:
- 自定义类没重写 toString()?那对应位置还是显示 com.xxx.MyClass@abc123
- 混合嵌套没问题(比如 Object[] 里有 int[]、String[] 和 null),它都能分别处理
- 性能开销极小,日常日志或单元测试中完全可放心使用










