Arrays.toString()仅适用于一维数组,对多维数组会显示内存地址;应使用Arrays.deepToString()递归格式化任意维度数组。

Arrays.toString() 只能正确格式化一维数组;对多维数组(如二维、三维)会调用其元素的 toString() 方法,而数组对象默认返回内存地址形式的字符串(如 [I@1b6d3586),导致输出不可读。
一维数组:直接显示元素内容
对基本类型或引用类型的一维数组,Arrays.toString() 会遍历每个元素,用方括号和逗号拼接成易读格式:
-
int[] arr1 = {1, 2, 3};→[1, 2, 3] -
String[] arr2 = {"a", "b"};→[a, b] - 内部逻辑相当于手动拼接:
"[" + String.join(", ", elements) + "]"
多维数组:只“浅打印”,显示子数组引用
二维及以上数组本质是“数组的数组”,Arrays.toString() 不会递归处理子数组,而是把每个子数组当作普通对象调用其 toString():
-
int[][] arr = {{1,2}, {3,4}};→[[I@xxx, [I@yyy](两个 int[] 对象的哈希码) - 即使子数组内容相同,只要不是同一对象,地址也不同,无法看出结构
- 这是设计使然:该方法不负责深度遍历,避免隐式性能开销和无限递归风险
正确打印多维数组的方法
应使用 Arrays.deepToString(),它对每个嵌套层级都递归调用对应数组的字符串化逻辑:
立即学习“Java免费学习笔记(深入)”;
-
Arrays.deepToString(new int[][]{{1,2}, {3,4}})→[[1, 2], [3, 4]] - 支持任意维度:三维数组会输出类似
[[[1, 2]], [[3, 4]]] - 混合类型也安全,例如
Object[]中含 String、int[]、null 等,都能合理呈现
小提醒:别混用,也别自己“递归 toString”
手动对二维数组循环调用 Arrays.toString(row) 虽可行,但需额外处理外层括号和分隔符,易出错且不通用;而误用 toString() 原生方法(如 arr.toString())只会得到更难懂的结果(如 [[I@...)。统一用 deepToString() 是最简洁可靠的选择。



















