Java中toString()不会自动展示嵌套结构,需每层对象重写该方法才能递归调用;数组须用Arrays.toString()或deepToString(),集合自身已递归但元素需重写toString;推荐用IDE生成、Lombok@ToString或ToStringBuilder避免手动拼接。

Java 中 toString() 方法本身不会自动“展示”复杂嵌套结构——它只负责返回当前对象的字符串表示。能否清晰呈现嵌套关系,取决于你是否重写了该方法,以及嵌套对象是否也重写了 toString()。
嵌套对象的 toString 会自动递归调用
如果一个对象 A 包含另一个对象 B 的引用,而 B 已重写 toString(),那么在 A 的 toString() 中直接拼接 b.toString()(或直接用 b + "")就能自然带出 B 的可读内容。
- 不需要额外配置或反射,这是 Java 的默认行为
- 只要每层对象都重写了
toString(),链式调用就会逐层展开 - 例如:
Person包含Address字段,两者都重写后,person.toString()就能输出类似Person{name='Tom', address=Address{city='Beijing', street='Xuanwumen'}}
数组和集合需特别处理
toString() 对原生数组(如 int[]、String[])或未重写的自定义对象数组,只会显示哈希码(如 [Ljava.lang.String;@a1b2c3d4),无法看出内容。
- 基本类型数组:用
Arrays.toString(arr)(一维)或Arrays.deepToString(arr)(多维/嵌套) - 对象数组含子数组或集合:同样依赖
deepToString,前提是内部元素也提供了有意义的toString() - 集合(
List、Map等):它们自身的toString()已实现递归,但若元素是未重写的自定义对象,仍会显示哈希码
避免手动拼接,优先用工具辅助生成
手写 toString() 易出错、难维护,尤其字段多或嵌套深时。
立即学习“Java免费学习笔记(深入)”;
- IDE(IntelliJ / Eclipse / VSCode)支持一键生成,自动包含选中字段,并处理 null 和引号格式
- 使用 Lombok 的
@ToString注解,简洁声明即可,支持includeFieldNames、callSuper、排除特定字段等 - Apache Commons Lang 的
ToStringBuilder提供多种风格(如 JSON 风格、多行格式),适合需要统一日志规范的场景
调试时配合 deepToString 查看真实数据布局
当嵌套结构来自数组或 Object[] 混合容器(如 {new int[]{1,2}, Arrays.asList("a","b")}),单靠对象的 toString() 不够直观。
- 在断点处用
Arrays.deepToString(yourArray)快速看清每一层值和null位置 - 日志中加前缀输出,比如
log.info("Payload: {}", Arrays.deepToString(data)) - 注意:
deepToString只对数组有效,对ArrayList等需先转成数组(list.toArray())再调用


















