Arrays.toString对自定义对象数组默认打印hashcode,因未重写toString;含嵌套数组时须用Arrays.deepToString递归展开;但deepToString不穿透对象字段,仍需手动处理或重写toString。

对象数组直接用 Arrays.toString 会打印出 hashcode
这是最常踩的坑:当你对一个装了自定义对象(比如 User、Point)的数组调用 Arrays.toString(arr),输出往往是类似 [com.example.User@1f89ab83, com.example.User@45c8e616]。它没调用每个对象的 toString(),而是调用了 Object.toString() 的默认实现。
原因在于 Arrays.toString 对引用类型数组只做一层展开,内部仍依赖元素自身的 toString() 方法——如果你没重写,就只能看到 hashcode。
- 必须确保对象类已重写
toString(),否则无论用哪个方法都白搭 -
Arrays.toString适合元素本身是基础类型、String 或已规范重写toString()的简单对象 - 如果对象里还嵌套了数组(比如
int[]字段),toString()默认仍会打成[I@xxx,这时候就得换方法
含嵌套数组时必须用 Arrays.deepToString
当对象字段里有数组(如 int[] scores、String[] tags),或者你直接操作的是多维数组(String[][]、Object[][]),Arrays.toString 就完全失效——它把内层数组当普通对象处理,依然只输出 hashcode。
Arrays.deepToString 会递归遍历每一层,对遇到的数组继续调用 deepToString,对非数组对象才调用其 toString()。这才是“真正展开”的逻辑。
立即学习“Java免费学习笔记(深入)”;
- 对二维数组
String[][] data = {{"a","b"},{"c"}};,Arrays.toString(data)输出[[Ljava.lang.String;@..., [Ljava.lang.String;@...];而Arrays.deepToString(data)输出[[a, b], [c]] - 对对象数组,只要其中任意一个对象字段含数组,且你希望该数组内容也可见,就必须用
deepToString - 性能上略低(递归 + 类型判断),但日常日志或调试场景几乎无感
自定义对象里有数组字段,deepToString 不自动生效
Arrays.deepToString 只对「数组类型」递归,不会穿透普通对象字段。比如你有个 Person 类,里面有 String[] phones,那么即使你用 Arrays.deepToString(persons),输出里 phones 字段依然显示为 [Ljava.lang.String;@...。
根本原因:deepToString 不负责反射读取对象内部字段,它只识别参数本身是不是数组类型。
- 解决办法只有两个:在
Person.toString()里手动调用Arrays.toString(phones)或Arrays.deepToString(phones) - 别指望靠换工具方法绕过重写
toString()—— 这是 Java 的设计边界 - 如果用 Lombok,记得加
@ToString(includeFieldNames = true)并确认它对数组字段的处理是否符合预期(默认会调用Arrays.toString)
字符串拼接场景下,别用 Arrays.toString 做中间步骤
有人想把数组转字符串再截掉方括号、逗号,比如 Arrays.toString(arr).substring(1, ...)。这不仅脆弱(空数组、null 元素都会崩),而且语义错乱——你本意可能是格式化输出,却用调试工具凑合。
真要拼接,优先考虑 String.join 或流式处理:
String.join(", ", Arrays.stream(arr).map(Object::toString).toArray(String[]::new))
-
Arrays.toString是为调试/日志设计的,带固定格式(方括号、逗号空格),不适合二次解析 - 如果元素可能为
null,Arrays.toString会打出"null"字符串,但String.join会直接抛NullPointerException - 需要控制分隔符、前后缀、null 处理逻辑时,硬拆
Arrays.toString输出是给自己埋雷
deepToString 是否覆盖到所有嵌套层,后者往往得绕开它,自己构造逻辑。










