要让数组内容“可读”,关键不是改arrays.tostring,而是确保数组元素重写tostring()方法;也可用arrays.deeptostring处理嵌套数组,或借助lombok、jackson等工具自动生成或转json。

Arrays.toString 默认只调用数组每个元素的 toString() 方法,而 Object 类的默认实现返回的是类名加哈希码(如 com.example.User@1f32e575),所以看不到实际属性值。要让数组内容“可读”,关键不是改 Arrays.toString,而是确保数组里的对象自己能正确描述自身。
重写对象的 toString() 方法
这是最直接、最常用的方式。在你的类中覆盖 toString(),返回包含关键属性的字符串:
- 使用
@Override注解,避免拼写错误 - 推荐用
Objects.toString()或String.format()拼接,避免空指针 - 例如:public String toString() { return String.format("User{name='%s', age=%d}", name, age); }
用 Arrays.deepToString 处理嵌套数组
如果数组里存的是二维数组、Object[] 等嵌套结构,Arrays.toString() 只会打印内层数组的引用地址。此时应改用:
-
Arrays.deepToString(arr)—— 它会递归调用各层元素的toString() - 仍需保证内层对象(包括嵌套数组中的对象)已重写
toString()
借助工具类或现代方式(如 Lombok、Jackson)
不想手动写 toString()?有更省事的办法:
- 用 Lombok 的
@ToString注解,编译时自动生成(支持 exclude 某些字段) - 用 Jackson 的
ObjectMapper.writeValueAsString()转成 JSON 字符串,清晰又结构化 - 调试时可直接用 IDE 的“View as Object”或“Evaluate Expression”,无需改代码
临时调试:用 Stream + map 手动格式化
不改源码、也不引入依赖时,可以临时用流处理:
- String result = Arrays.stream(arr).map(Object::toString).collect(Collectors.joining(", ", "[", "]"));
- 配合 lambda 更灵活,比如
.map(u -> u instanceof User ? ((User)u).getName() : u.toString())











