Arrays.toString()用于一维数组,Arrays.deepToString()用于多维数组;二者均需显式调用并导入java.util.Arrays,不可直接调用arr.toString(),且null需判空处理。

直接打印数组(如 System.out.println(arr))只会看到类似 [I@1b6d3586 的地址,根本看不出内容。真正想看清数组里有什么,得靠 Arrays.toString() 或它的“深度版”——Arrays.deepToString()。关键不是记住方法名,而是知道什么时候用哪个、怎么用才不踩坑。
一维数组:Arrays.toString() 是你的默认选项
它专为一维设计,支持所有基本类型(int[]、char[]、boolean[]等)和对象数组(String[]、Person[]),自动处理 null 元素并调用每个元素的 toString() 方法。
- 必须显式调用:
Arrays.toString(arr),不能写成arr.toString()(数组没重写这个方法) - 记得导入:
import java.util.Arrays;,否则编译失败 - 对
char[],它输出的是[a, b, c],不是字符串"abc";如需后者,用new String(arr) - 传入
null会抛NullPointerException,调试时建议先判空:arr == null ? "null" : Arrays.toString(arr)
二维及以上:deepToString 才能真正展开
Arrays.toString() 遇到 int[][] 或 Object[][] 就“罢工”,只显示子数组的哈希码。要看到 [[1, 2], [3, 4]] 这样的结构,必须换用 Arrays.deepToString()。
- 它递归遍历每一层,支持任意维度(
int[][][]、String[][][][])和混合嵌套(如Object[]里同时含int[]和List<String>) - 对
Map或未重写toString()的自定义对象,仍会显示地址;此时需单独处理或配合@ToString(Lombok) - 输出是紧凑单行,适合快速验证结构;若嵌套太深、数据太多,可配合
Arrays.copyOf(arr, 10)截断再打印
Debug 时让数组“一眼可见”的实用技巧
别只依赖 System.out.println——IDE 调试器里就有更高效的方式。
立即学习“Java免费学习笔记(深入)”;
- 在 IntelliJ 的 Watches 面板中直接添加表达式:
Arrays.deepToString(myMatrix),让它常驻显示,不用反复敲 - 断点处右键 → “Evaluate Expression”,输入
Arrays.toString(items)实时查看,改完立刻验证 - 配合条件断点:比如
data != null && data.length > 0,再在表达式里看前几项,避免大数组卡死 - 如果元素是自定义对象且没重写
toString(),临时加个私有调试方法:debugPrint(Person[] ps),内部用Stream提取关键字段拼接
别把它当序列化工具
Arrays.toString() 只生成人类可读的快照,不是真正的序列化:不能还原成数组、不保留类型信息、不含元数据,也不安全(敏感字段会直接暴露)。
- 日志中打印密码数组?绝对不行——应脱敏或跳过
- 需要持久化或跨系统传输?选
Gson.toJson(arr)或ObjectMapper等正规序列化方案 - 单元测试里验证数组内容?用
assertArrayEquals(),而不是肉眼比对toString()输出


















