Arrays.toString不能直接打印对象数组是因为它对引用类型数组仅调用元素的toString()方法,而Object默认实现返回类名加哈希码;解决办法是重写toString()或改用Arrays.deepToString。

Arrays.toString 为什么不能直接打印对象数组
调用 Arrays.toString 打印自定义类或 Object[] 时,控制台常显示类似 [Lcom.example.User;@1b6d3586 的结果——这不是 bug,而是因为 Arrays.toString 对引用类型数组只调用元素的 toString() 方法,而默认继承自 Object 的实现只返回类名+哈希码。
解决办法是确保每个元素类都重写了 toString() 方法;若无法修改源码(如第三方类),可改用 Arrays.deepToString(对嵌套数组更友好)或手动遍历格式化。
基本用法与常见类型支持范围
Arrays.toString 支持所有 Java 内置数组类型:int[]、String[]、boolean[] 等,但不接受泛型集合(如 ArrayList),也不接受 null 数组(会抛 NullPointerException)。
示例:
int[] nums = {1, 2, 3};
System.out.println(Arrays.toString(nums)); // 输出: [1, 2, 3]
String[] strs = {"a", "b"};
System.out.println(Arrays.toString(strs)); // 输出: [a, b]
- 传入
null会直接崩溃,调试前建议先判空:arr == null ? "null" : Arrays.toString(arr) - 对
char[],它输出的是字符序列(如[a, b, c]),不是字符串字面量;若要转成字符串,用new String(arr) - 它不处理多维数组——
int[][]会被当成Object[],输出地址;此时必须用Arrays.deepToString
替代方案:什么时候不该用 Arrays.toString
当数组含敏感字段(如密码、token)、长度极大(如百万级)、或需结构化日志(如 JSON 格式)时,Arrays.toString 就不合适了。
- 大数组打印会卡主线程、撑爆日志文件,建议截断:
Arrays.toString(Arrays.copyOf(arr, Math.min(10, arr.length))) - 需要 JSON 输出时,别硬拼字符串,用
ObjectMapper.writeValueAsString(arr)(Jackson)或Gson.toJson(arr) - 在单元测试中验证数组内容,优先用
Assert.assertArrayEquals,而非依赖打印后肉眼比对
IDE 调试时比 println 更省事的办法
其实多数现代 IDE(IntelliJ / Eclipse)在 debug 模式下悬停变量就能展开数组内容,无需手写 Arrays.toString。但要注意:
- 悬停显示可能被“Show values in tooltip”设置限制,默认只显示前 100 项,可在设置里调高
- 如果数组是局部变量且已出作用域,console 中的
println仍是唯一可靠方式 - 某些框架(如 Spring Boot DevTools)提供
@Controller返回数组时自动 JSON 化,此时浏览器访问接口比看日志更快
真正容易被忽略的是:同一行多次调用 Arrays.toString(比如循环内打点)会产生大量临时字符串,影响 GC。调试完成后务必删掉,或用条件编译包裹(如 if (DEBUG) System.out...)。










