Arrays.toString()仅展开一层,对数组元素调用Object.toString()输出地址;Arrays.deepToString()递归展开所有层级数组,直至非数组元素才调用其toString()。

核心区别一句话说清
Arrays.toString()只展开一层,遇到数组元素就停,直接调用其默认Object.toString()输出地址;Arrays.deepToString()会递归识别并展开所有层级的数组,直到元素不再是数组才调用其toString()。
什么时候必须用deepToString
当你处理的是多维数组(如int[][]、String[][]、Object[][])或对象数组中包含数组字段时,toString()会失效,输出类似[Ljava.lang.String;@xxx这种不可读内容。
- 二维整数数组:
int[][] data = {{1,2}, {3}};→toString(data)输出[[I@..., [I@...],而deepToString(data)输出[[1, 2], [3]] - 字符串二维数组:
String[][] names = {{"Alice","Bob"}, {"Charlie"}};→ 同样只有deepToString能显示内部字符串 - 注意:
deepToString只接受Object[]参数,不能直接传int[]等基本类型一维数组(会编译报错)
自定义对象数组的坑:重写toString是前提
即使你用了deepToString,如果数组元素是自定义类(如User、Person),且该类没重写toString(),结果仍是com.example.User@1f89ab83这类hashcode——因为deepToString对非数组元素,仍依赖对象自身的toString()逻辑。
- 正确做法:在User类里明确重写
public String toString(),返回可读字段(如"User{name='" + name + "', age=" + age + "}") - 若User里还有
String[] phones字段,deepToString不会自动展开phones;你得在User.toString()里手动调用Arrays.toString(phones)或Arrays.deepToString(phones) - 别指望换方法绕过重写toString——这是Java的设计边界,不是bug
性能与适用场景提醒
deepToString因需逐层判断类型+递归调用,开销略高于toString,但日常调试、日志打印完全无感,无需优化。
- 一维简单数组(基础类型、String、已重写toString的类)→ 优先用
Arrays.toString() - 含嵌套数组的结构(多维数组、对象含数组字段)→ 必须用
Arrays.deepToString(),并确保相关类已重写toString() - 想彻底避免踩坑:把重写toString()当成自定义实体类的标配动作

















