直接打印数组名输出内存地址,因数组未重写tostring();arrays.tostring()可清晰显示一维数组内容,多维数组需用deeptostring(),且须判空防npe。

直接用 System.out.println(array) 打印数组,输出的是类似 [I@1b6d3586 这样的内存地址,根本看不出内容;而 Arrays.toString(array) 会清晰显示 [1, 2, 3] 这样的结构化结果——这是调试中最容易踩坑、也最该立刻纠正的习惯。
为什么直接打印数组名不行
数组是引用类型,但没重写 Object.toString(),所以默认调用的是父类方法,只返回类名加哈希码。哪怕你传的是 String[] 或 char[],只要没经过 Arrays 工具处理,就看不到真实元素。
-
int[] arr = {1, 2, 3}; System.out.println(arr);→ 输出[I@xxxxxx -
char[] cs = {'h', 'i'}; System.out.println(cs);→ 竟然意外输出hi(这是特例,因为PrintStream对char[]有特殊处理,不可依赖) - 所有其他类型数组(
int[]、String[]、Object[]等)都统一返回地址字符串
Arrays.toString 的正确用法
它专为一维数组设计,自动加中括号、逗号分隔,支持所有基本类型和引用类型数组。
- 基本类型:
int[] a = {10, 20}; System.out.println(Arrays.toString(a));→[10, 20] - 引用类型:
String[] s = {"a", "b"}; System.out.println(Arrays.toString(s));→[a, b] - 务必判空:传入
null会抛NullPointerException,调试时建议封装一层:System.out.println(arr == null ? "null" : Arrays.toString(arr));
多维数组要用 deepToString
Arrays.toString() 对二维及以上数组无效,它只会把每一行当作一个对象打印其地址。
- 错误示例:
int[][] mat = {{1,2}, {3,4}};System.out.println(Arrays.toString(mat));→[[I@xxx, [I@yyy] - 正确做法:
System.out.println(Arrays.deepToString(mat));→[[1, 2], [3, 4]] - 同样适用于三维、四维数组,无需额外处理
替代方案与适用场景
不是所有情况都适合 Arrays.toString(),按需选择更合适的方式。
- 想逐行打印每个元素:用增强 for 循环或传统 for,便于加日志前缀或条件过滤
- 需要自定义格式(如不带括号、用竖线分隔):手动遍历拼接字符串
- 对象数组且希望显示有意义内容:确保元素类重写了
toString(),否则Arrays.toString()仍会显示地址 - Java 8+ 可用 Stream:
Arrays.stream(arr).map(String::valueOf).collect(Collectors.joining(", ")),灵活性高但略重











