Arrays.toString()是打印一维数组最轻量可靠的方式,它将默认的内存地址(如[I@1b6d3586)转为可读格式[1, 2, 3],支持所有基本与引用类型且对null安全;二维及以上需用Arrays.deepToString()。

直接用 Arrays.toString() 打印一维数组,是最轻量、最可靠的可视化方式——它不依赖框架、不改逻辑、一行代码就能让数组从“内存地址”变成“可读内容”。
为什么调试时总看到 [I@1b6d3586 这种东西?
因为原生数组没重写 toString(),JVM 默认返回的是类型+哈希码。IDE 变量面板、System.out.println(arr)、甚至 String.valueOf(arr) 都只是调用了这个默认实现,根本看不到元素。
什么时候该用 Arrays.toString()?
它专为一维数组设计,覆盖所有基本类型(int[]、char[]、boolean[] 等)和引用类型(String[]、Object[]),且对 null 数组安全返回 "null" 字符串,不会抛异常。
-
int[] nums = {1, 2, 3};→Arrays.toString(nums)输出[1, 2, 3] -
String[] names = {"Alice", null, "Bob"};→ 输出[Alice, null, Bob] -
char[] cs = {'h', 'e', 'l', 'l', 'o'};→ 输出[h, e, l, l, o](不是"hello",如需字符串请用new String(cs))
调试中真正管用的操作技巧
- 在 IntelliJ 的 Evaluate Expression(Alt+F8)里直接输入
Arrays.toString(data),断点停住就能实时看内容,不用改代码、不用加日志 - 把常用表达式加到 Watches 面板:比如
Arrays.toString(requestParams),让它常驻显示,避免反复输入 - 日志中优先用占位符写法:
log.debug("IDs: {}", Arrays.toString(ids)),比字符串拼接更高效、线程安全
二维及以上数组?别硬套,换 Arrays.deepToString()Arrays.toString(new int[][]{{1,2},{3,4}}) 输出的是 [[I@xxx, [I@yyy] —— 没意义。
正确做法是:Arrays.deepToString(new int[][]{{1,2},{3,4}}) → [[1, 2], [3, 4]]
它会递归展开每一层数组,支持 Object[][]、混合嵌套(如 {new int[]{1}, "text"}),但注意:
- 输入为
null时会直接抛NullPointerException,建议先判空:arr == null ? "null" : Arrays.deepToString(arr) - 自定义对象若没重写
toString(),仍显示MyClass@abc,deepToString不深入字段,只负责数组结构
不想暴露敏感数据或怕刷屏?加一层防护
- 大数组截断:
Arrays.toString(Arrays.copyOf(arr, Math.min(10, arr.length))) - 敏感字段过滤:配合
Stream做脱敏,例如密码字段替换为"***"再拼接 - 控制台输出前加标签:
System.err.println("[DEBUG] payload: " + Arrays.toString(payload)),方便快速定位
替代方案:当 Arrays.toString() 不够用时
立即学习“Java免费学习笔记(深入)”;
- 要自定义分隔符(如用
|代替,):String.join("|", Arrays.stream(arr).map(String::valueOf).toArray(String[]::new)) - 要对齐打印矩阵:用
printf控制宽度,比如System.out.printf("%4d ", value) - IDE 悬停看数组?记得检查设置里 “Show values in tooltip” 是否开启,以及最大显示项数是否足够
不复杂但容易忽略——你写的不是“打印语句”,而是把内存里的原始结构翻译成人能懂的语言。


















