arrays.deeptostring仅递归处理数组类型,对非数组对象直接调用其tostring()方法;不穿透对象字段,嵌套数组需在对象tostring()中手动用arrays.tostring或deeptostring处理。

Arrays.deepToString 并不“处理”非数组对象,它只对数组类型递归展开,对普通对象仍调用其 toString() 方法——这意味着结果完全取决于该对象是否重写了 toString。
deepToString 的作用边界很明确
它只识别参数本身是不是数组(包括 Object[]、int[][]、String[][] 等),然后逐层向下:遇到数组就继续 deepToString,遇到非数组(比如 String、Integer、自定义 User 实例)就直接调用它的 toString()。
- 如果传入的是 Object[],且其中元素是 String 或已重写 toString() 的对象,deepToString 会正常显示字符串内容
- 如果元素是未重写 toString() 的自定义类实例(如 new Person()),仍会输出 com.example.Person@xxxx 格式
- 它不会穿透对象字段——哪怕 Person 类里有 int[] scores 字段,deepToString(persons) 也不会展开 scores,只会把整个 Person 当作一个普通对象处理
嵌套数组字段需手动处理
当你的对象内部含有数组字段(如 String[] tags、double[][] matrix),想让这些字段内容也清晰可见,必须在该对象的 toString() 中显式调用 Arrays.toString 或 Arrays.deepToString:
- 对一维数组字段:用 Arrays.toString(tags)
- 对多维或含嵌套数组的字段:用 Arrays.deepToString(matrix)
- 不要依赖 deepToString 自动“挖进去”,Java 不做反射式字段遍历
适用场景与替代建议
deepToString 最适合用于调试和日志输出,尤其是多维原始类型数组(int[][]、String[][])或元素为简单对象(String、Integer、已规范重写 toString 的类)的 Object[]。
- 纯对象数组(如 User[])若要完整展示,优先确保 User 类重写了 toString(),并在其中格式化所有关键字段
- 若字段含数组,就在 toString() 里嵌入 Arrays.deepToString(this.tags)
- 避免混用:别对二维数组先用 toString() 再试图“补救”,统一用 deepToString 更可靠
它不是万能的对象序列化工具,而是专为“数组的数组”设计的字符串化方法。理解这点,就能避开大多数误用。











