应使用Arrays.equals()比较一维数组内容,Arrays.deepEquals()比较嵌套数组;二者均处理null安全,但deepEquals()支持递归比较且性能较低。

用 Arrays.equals() 判断两个数组内容是否相等
Java 里不能直接用 == 或 .equals() 比较两个数组对象,因为那比的是引用地址,不是元素内容。必须用 java.util.Arrays 提供的静态方法。
对一维基本类型数组(如 int[]、double[])和 Object[],直接调 Arrays.equals(a, b) 就行,它内部会逐个比较元素:
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
boolean same = Arrays.equals(a, b); // true
- 如果任一参数为
null,结果直接是false(不抛异常) - 数组长度不同,立刻返回
false,不继续比较 - 对
Object[],元素比较仍调用其.equals(),所以确保元素类重写了该方法
嵌套数组要用 Arrays.deepEquals()
二维及以上数组(比如 int[][]、String[][]),Arrays.equals() 会把子数组当对象比引用,永远返回 false —— 即使内容完全一样。
这时必须换 Arrays.deepEquals(),它会递归进每一层做内容比较:
int[][] x = {{1, 2}, {3}};
int[][] y = {{1, 2}, {3}};
boolean same = Arrays.deepEquals(x, y); // true
-
deepEquals()支持任意维度的嵌套数组,包括混合类型(如Object[]里含String和int[]) - 性能比
equals()差,因为要递归遍历;简单场景别滥用 - 如果某层子数组是
null,它也能安全处理(而手动写递归容易 NPE)
自定义对象数组比较时,equals() 必须可靠
用 Arrays.equals() 比较 Person[] 这类数组,最终依赖每个 Person 实例的 .equals() 方法。如果没重写,就退化成引用比较,结果不可信。
- 检查你的类是否覆盖了
equals()和hashCode()(后者虽不直接影响Arrays.equals(),但属于配套规范) - 避免在
equals()里用==比较字符串字段,要用.equals() - 字段为数组类型时,记得在
equals()里用Arrays.equals()而不是==
注意 null 元素和空数组的边界行为
Arrays.equals() 对 null 值的处理很直接:两个 null 元素视为相等;一个 null 一个非 null 视为不等。但这容易被忽略:
String[] s1 = {null, "a"};
String[] s2 = {null, "a"};
Arrays.equals(s1, s2); // true
String[] s3 = {null, "a"};
String[] s4 = {"a", null};
Arrays.equals(s3, s4); // false —— 顺序不同
- 空数组
new int[0]和new int[0]是相等的 - 但
new String[0]和null不等(前者是数组对象,后者是空引用) - 如果业务逻辑允许
null元素,测试时务必覆盖null在首/中/尾的 case
多维数组深层的 null 更难察觉,这时候 deepEquals() 的健壮性才有价值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











