Arrays.toString适用于一维基本类型和String数组,直接格式化输出;对象数组需重写toString或用deepToString;二维数组必须用deepToString;null、超大或敏感数组需额外处理。

直接用 Arrays.toString 打印数组,是调试中最轻量、最常用的方式,但它不是“万能胶”——用对场景才真正省事。
一维基本类型和字符串数组:开箱即用
对 int[]、double[]、String[]、boolean[] 等常见一维数组,Arrays.toString 会自动格式化为可读字符串,带方括号和逗号分隔。
-
int[] nums = {7, 13, 21}; System.out.println(Arrays.toString(nums));→ 输出[7, 13, 21] -
String[] names = {"Alice", "Bob"}; System.out.println(Arrays.toString(names));→ 输出[Alice, Bob] -
char[] cs = {'h', 'e', 'l', 'l', 'o'};输出是[h, e, l, l, o],不是"hello";如需字符串,写new String(cs)
对象数组:默认只打地址,得手动干预
对 User[]、Object[] 这类引用类型数组,Arrays.toString 不会展开内容,而是调用每个元素的 toString()。若没重写,就显示类似 com.example.User@3a71f4dd 的哈希码。
- 解决办法一:在
User类中重写toString(),返回有意义的字段组合 - 解决办法二:无法改源码时(如第三方类),换用
Arrays.deepToString(arr)——它对单层对象数组效果相同,且兼容嵌套结构 - 注意:
deepToString对基本类型数组也完全兼容,可统一使用,避免判断类型
二维及多维数组:千万别用 toString,要用 deepToString
Arrays.toString 把二维数组(如 int[][])当成 Object[] 处理,只打印子数组的内存地址。
立即学习“Java免费学习笔记(深入)”;
- 错误示范:
int[][] mat = {{1,2}, {3,4}}; System.out.println(Arrays.toString(mat));→ 输出类似[[I@1b6d3586, [I@1c73145] - 正确做法:
System.out.println(Arrays.deepToString(mat));→ 输出[[1, 2], [3, 4]] - 即使是一维
String[],若其中某些元素本身是数组(如混入int[]),deepToString也能递归展开
安全与边界:别让打印拖垮调试体验
看似简单的方法,实际运行中容易踩坑:
-
null数组会直接抛NullPointerException,建议封装一层:arr == null ? "null" : Arrays.toString(arr) - 超大数组(如百万级)打印会卡顿、撑爆日志,可截断:
Arrays.toString(Arrays.copyOf(arr, Math.min(20, arr.length))) - 含敏感数据(密码、token)的数组,禁止直接打印;生产环境日志应过滤或脱敏
- 单元测试中验证数组内容,优先用
Assert.assertArrayEquals,而非肉眼比对打印结果



















