arrays.tostring() 默认只显示自定义对象的类名和哈希码,需重写 tostring() 方法才能输出字段内容;重写时应使用 @override、避免空指针、返回清晰字符串;二维数组须用 arrays.deeptostring();无法修改类时可用 stream 或 json 库替代。

默认情况下,Arrays.toString() 对自定义对象数组只会打印每个元素的类名加哈希码(如 MyClass@1b6d3586),无法显示实际字段内容。要让输出可读,必须为自定义类重写 toString() 方法。
重写自定义类的 toString() 方法
这是最关键的一步。只有当对象自身能返回有意义的字符串时,Arrays.toString() 才能格式化出有用结果。
- 在自定义类中用
@Override显式重写toString() - 返回一个简洁、清晰、包含关键字段的字符串,通常用
String.format()或字符串拼接 - 避免返回
null或抛异常,确保方法始终安全执行
示例:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return String.format("Person{name='%s', age=%d}", name, age);
}
}
调用 Arrays.toString() 输出数组
数组元素类型是自定义类且已重写 toString() 后,直接传入即可获得格式化结果。
- 对一维对象数组使用
Arrays.toString(arr) - 对二维数组用
Arrays.deepToString(arr)(否则只显示子数组引用) - 注意:该方法不修改原数组,只生成字符串副本
示例用法:
Person[] people = {
new Person("Alice", 30),
new Person("Bob", 25)
};
System.out.println(Arrays.toString(people));
// 输出:[Person{name='Alice', age=30}, Person{name='Bob', age=25}]
替代方案:手动格式化或使用第三方库
如果无法修改类源码(如第三方类),或需要更灵活的输出格式,可考虑以下方式:
- 用
Stream+map+collect自定义拼接逻辑 - 使用 Jackson、Gson 等序列化库转成 JSON 字符串(适合调试或日志)
- 借助 Apache Commons Lang 的
ToStringBuilder.reflectionToString()(需添加依赖)
例如流式处理:
String s = Arrays.stream(people)
.map(p -> String.format("{%s,%d}", p.getName(), p.getAge()))
.collect(Collectors.joining(", ", "[", "]"));
// 输出:[{Alice,30}, {Bob,25}]
常见误区提醒
容易忽略但影响效果的细节:
- 忘记
@Override注解,导致重写失败(编译不报错但运行无效) - 字段为
null时未做空值检查,toString()中直接调用.toString()抛NullPointerException - 误对基本类型数组(如
int[])使用Arrays.toString()—— 实际支持,但它是重载版本,无需重写 - 对嵌套对象未递归处理,导致深层字段仍显示为
ClassName@xxx
不复杂但容易忽略。核心就一条:让每个对象自己知道怎么“说清楚自己”,Arrays.toString() 才能帮你把整组对象整齐列出来。











