Arrays.toString专用于一维数组调试,输出简洁可读且防空指针;多维数组须用deepToString,但需判空;日志中应通过占位符传参避免拼接,大数组需截断,IDE调试时需手动调用。

Arrays.toString 是 Java 调试中最常用、最轻量的数组可视化工具,但它不是“一贴灵”——用对场景才真正提效。它专为一维数组设计,输出简洁可读,且天然规避空指针风险;一旦误用于多维结构或忽略边界条件,日志和断点反而会误导排查方向。
一维数组调试:一行代码看清内容
对 int[]、String[]、boolean[]、自定义对象数组等所有一维类型,Arrays.toString() 直接返回带方括号、逗号分隔的标准格式,元素 null 会如实显示为字面量 "null",不会抛异常。
- int[] arr = {1, 0, -5}; → [1, 0, -5]
- String[] names = {"Alice", null, "Bob"}; → [Alice, null, Bob]
- User[] users = {u1, u2};(前提是 User 重写了 toString)→ [User{id=1}, User{id=2}]
二维及以上数组:必须换用 deepToString
Arrays.toString 对 int[][]、String[][] 等只打印子数组引用地址,如 [[I@abc, [I@def],完全不可读。这是因为其内部不递归处理数组元素,而子数组本身仍是对象。
- 错误写法:Arrays.toString(new int[][]{{1,2},{3,4}}) → [[I@..., [I@...]
- 正确写法:Arrays.deepToString(new int[][]{{1,2},{3,4}}) → [[1, 2], [3, 4]]
- 注意:deepToString 传入 null 会直接抛 NullPointerException,建议统一判空:arr == null ? "null" : Arrays.deepToString(arr)
日志输出规范:避免字符串拼接性能损耗
在 SLF4J、Log4j 等框架中,应把 Arrays.toString() 结果作为参数传入占位符,而非提前拼接字符串。前者延迟执行、节省 GC;后者无论日志级别是否开启都会构造完整字符串。
立即学习“Java免费学习笔记(深入)”;
- 推荐:log.debug("Params: {}", Arrays.toString(ids));
- 不推荐:log.debug("Params: " + Arrays.toString(ids));
- 大数组防刷屏:加长度判断,如 items.length <= 100 ? Arrays.toString(items) : Arrays.toString(Arrays.copyOf(items, 100)) + " (truncated)"
IDE 调试时主动调用:别只靠变量面板
IntelliJ 或 Eclipse 的 Variables 视图默认不调用 Arrays.toString,原生数组仍显示 [I@xxx。可在断点处使用 Evaluate Expression 手动输入表达式,实时查看结构化内容。
- 输入:Arrays.toString(myInts) → 立即得 [12, 34, null, 56]
- 二维数组输入:Arrays.deepToString(matrix)
- 关键数组可添加到 Watches 面板常驻显示,避免反复输入


















