Arrays.equals()对二维数组失效是因为其底层调用Objects.equals()比较子数组,而int[]等未重写equals(),导致实际执行引用比较;Arrays.deepEquals()则递归进行深度内容比对,支持任意嵌套。

Arrays.equals() 只能正确比对一维数组,对多维数组(如 int[][]、String[][] 等)会退化为引用比较,结果不可靠;而 Arrays.deepEquals() 才是专为嵌套数组设计的深度内容比对方法,能递归比较每一层元素。
为什么 Arrays.equals() 对二维数组失效?
因为 Java 中多维数组本质是“数组的数组”,例如 int[][] 实际是 int[] 类型的引用数组。调用 Arrays.equals(arr1, arr2) 时,底层逐个调用 Objects.equals(a[i], b[i]) —— 而对每个子数组 a[i] 和 b[i],Objects.equals() 又会调用其 equals() 方法。但 int[] 没有重写 equals(),所以实际执行的是 == 引用比较,只要两个子数组不是同一个对象,就返回 false,哪怕内容完全一样。
例如:
int[][] a = {{1, 2}, {3, 4}};
int[][] b = {{1, 2}, {3, 4}};
System.out.println(Arrays.equals(a, b)); // false(即使内容相同)
Arrays.deepEquals() 的工作原理
它会递归识别数组类型:遇到基本类型数组(如 int[]),调用对应 Arrays.equals();遇到引用类型数组(如 String[] 或 Object[][]),则继续对每个元素调用 deepEquals();遇到非数组对象,则直接用 Objects.equals() 比较。
支持任意嵌套深度,包括混合类型(如 Object[] 中含 String、int[]、Integer[][] 等)。
例如:
int[][] a = {{1, 2}, {3, 4}};
int[][] b = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepEquals(a, b)); // true ✅
使用时的关键注意事项
- 两个参数必须是同类型数组(或都为
null),否则直接返回false;类型不兼容不会抛异常,但结果无意义 -
null值被安全处理:deepEquals(null, null)返回true,deepEquals(null, someArray)返回false - 对非数组对象(如
String、Integer)也能传入,此时行为等价于Objects.equals(),不会报错 - 性能略低于
Arrays.equals(),因涉及类型检查和递归调用,但这是深度比对的合理开销
何时该选哪个?一句话判断
只有一维数组(无论基本类型还是引用类型),用 Arrays.equals();只要出现至少一层嵌套(int[][]、String[][][]、List>[] 等),必须用 Arrays.deepEquals()。
如果不确定维度,或数组类型来自泛型/反射(比如 Object 类型参数),优先用 deepEquals() 更稳妥。










