arrays.tostring()不能直接打印对象数组元素内容,因其仅调用元素tostring()方法,未重写则输出哈希码;基本类型和string数组可用,自定义类须重写tostring(),嵌套数组须用deeptostring()。

Arrays.toString() 为什么不能直接打印对象数组的元素内容
因为 Arrays.toString() 对对象数组(比如 String[]、自定义类数组)只调用每个元素的 toString() 方法,而如果你没重写该方法,就会输出类似 com.example.User@1f32e575 这种无意义的哈希码。这不是 bug,是 Java 的默认行为。
实操建议:
- 对基本类型数组(
int[]、double[]等),Arrays.toString()开箱即用,结果清晰可读 - 对
String[]也安全,因为String已重写toString() - 对自定义类数组,必须确保类中重写了
toString()方法,否则日志/调试时看不出实际数据
嵌套数组要用 Arrays.deepToString(),别混用
当你有 int[][]、String[][] 或更深层嵌套时,Arrays.toString() 只会展开第一层,内部数组仍显示为 [I@xxx 这类内存地址。这是最常踩的坑——以为“打印了”,其实只看到壳。
实操建议:
- 二维及以上数组,一律改用
Arrays.deepToString() - 它会递归调用每一层的
toString()或deepToString(),真正展开全部内容 - 注意:即使某一层是
null,deepToString()也能安全输出"null",而toString()遇到null元素会抛NullPointerException
替代方案:用 Arrays.asList() + System.out.println() 适合哪些场景
Arrays.asList(arr) 把数组转成 List 后再打印,看起来更“简洁”,但有严重限制——它不适用于基本类型数组(编译报错),且返回的是固定大小的 List(底层仍是原数组)。
实操建议:
- 仅对
String[]、Integer[]等引用类型数组临时调试可用 - 不要依赖它做逻辑判断或修改,因为
add()/remove()会抛UnsupportedOperationException - 如果只是想快速看内容,不如直接用
Arrays.toString()更直白、无歧义
性能和兼容性:别在高频循环里反复调用
Arrays.toString() 内部会新建 StringBuilder、遍历数组、拼接字符串,属于非轻量操作。在日志频繁打点或实时计算路径中滥用,可能引发 GC 压力或字符串对象堆积。
实操建议:
- 调试阶段随便用;生产环境日志中,优先考虑是否真需要完整数组内容(比如只打前 3 个元素就够了)
- Android 低版本(API Arrays.toString(),需自行实现或用
TextUtils.join()替代 - 如果数组很大(>1000 元素),考虑加长度判断再决定是否展开,避免日志刷屏或 OOM
deepToString() 和 toString() 的差异就不是语法问题,而是排查效率问题。










