必须用Arrays.deepEquals()比较多维或含数组元素的数组,因Arrays.equals()仅比引用;deepEquals()递归比较内容、支持null、要求自定义类重写equals()且维度一致。

判断两个数组内容是否相等,不能用 == 或 .equals(),因为它们比的是引用。一维数组用 Arrays.equals(),多维或嵌套数组必须用 Arrays.deepEquals()——它会递归进每一层比较实际内容,而不是看是不是“同一个对象”。
什么时候必须用 deepEquals()
当你面对二维及以上数组(如 int[][]、String[][][]),或者元素本身是数组的 Object[] 时,Arrays.equals() 就失效了:
-
Arrays.equals(new int[][]{{1,2}}, new int[][]{{1,2}})永远返回false,因为它在比子数组的引用地址 -
Object[] a = {new int[]{1}, "hello"};和Object[] b = {new int[]{1}, "hello"};用Arrays.equals(a,b)也会错判为不等 - 只有
Arrays.deepEquals(a, b)才能正确识别:第一层是对象数组,第二层是int[],它会自动调用Arrays.equals()去比那个int[]
deepEquals 的 null 安全与边界行为
它对 null 处理很稳健,不需要额外判空:
-
Arrays.deepEquals(null, null)→true -
Arrays.deepEquals(null, new int[][]{{1}})→false - 数组某一层含
null元素,比如String[][] x = {{null}, {"a"}};,只要对应位置也是null,就视为相等 - 但
null和空数组new String[0]不等——这是语义差异,不是 bug
自定义对象嵌套时的关键前提
deepEquals() 只负责“递归进数组”,不替你实现对象逻辑。如果数组里装的是自定义类,比如 Person[] 或 Object[]{new Person(), new int[]{1,2}},必须满足:
立即学习“Java免费学习笔记(深入)”;
- 每个
Person类已正确重写equals()(且最好配套hashCode()) - 若
Person内部有字段是数组(如int[] scores),其equals()方法里得用Arrays.equals(this.scores, that.scores),不能用== - 字符串字段别用
==比,一律用.equals()
性能和维度一致性提醒
它不是万能银弹,用前注意两点:
- 只适用于维度完全一致的数组:
int[2][3]和int[2][3][4]传进去会抛IllegalArgumentException - 递归带来开销:一维数组硬套
deepEquals()没必要,既慢又绕;简单场景坚持用Arrays.equals() - 它不管对象内部结构——比如
Person[]中的Person有个List<String>字段,deepEquals()不会深入比这个 list,靠的是Person.equals()自己怎么实现


















