Arrays.equals仅一层比较,遇数组元素用==判引用;Arrays.deepEquals递归深入各层,支持嵌套数组值比较。一维数组用equals,含嵌套数组必须用deepEquals。

Arrays.equals 和 Arrays.deepEquals 都用于比较数组内容是否相等,但它们处理嵌套数组的方式完全不同——关键区别在于:equals 只做**一层深度比较**,遇到元素是数组时直接用 == 判断引用;deepEquals 则会**递归进入每一层数组**,对多维或嵌套数组做语义上的“值相等”判断。
Arrays.equals 适用场景:一维数组或元素不可变/非数组类型
适用于 int[]、String[]、Integer[] 等一维数组,或元素本身不是数组的对象数组(如 Person[]),且你只关心顶层元素的 equals 行为。
- 对基本类型数组(int[]、double[] 等):逐个比较值,安全高效
- 对引用类型一维数组(String[]、Date[]):调用每个元素的 equals() 方法
- 若数组中某个元素是 int[],比如 Object[] arr = {new int[]{1,2}, "hello"},则 arr[0].equals(...) 不成立(int[] 没重写 equals),导致 Arrays.equals 返回 false —— 这不是 bug,而是设计如此
Arrays.deepEquals 适用场景:含嵌套数组的任意维度数组
当你需要判断 new int[][]{{1,2},{3}} 和 new int[][]{{1,2},{3}} 是否“逻辑相等”,或者 Object[] 中混有各种维数的数组时,必须用 deepEquals。
- 自动识别元素是否为数组:是,则递归调用 deepEquals;不是,则调用其 equals()
- 支持 null 安全:两个 null 元素视为相等;一个 null 一个非 null 视为不等
- 能正确比较 int[][]、String[][]、Object[](内含 int[] 和 String[])等混合结构
- 性能略低:因反射和递归开销,一维简单数组没必要用它
常见误用与注意事项
不要用 equals 比较二维数组——结果几乎总是 false,因为 int[][] 的元素是 int[] 引用,不同 new 出的 int[] 引用必然不等。
立即学习“Java免费学习笔记(深入)”;
- 错误写法: Arrays.equals(new int[][]{{1}}, new int[][]{{1}}) → false
- 正确写法: Arrays.deepEquals(new int[][]{{1}}, new int[][]{{1}}) → true
- 自定义对象数组若含数组字段,Arrays.deepEquals 不会深入该字段;它只对数组类型的元素递归,不处理对象内部字段
- deepEquals 不要求元素类实现 Serializable,也不依赖反射读取私有字段,只走 public 的 equals 或数组逻辑
一句话总结选择原则
看数组元素类型:如果所有元素都是基本类型、String、包装类、或你自己确保不会是数组,用 equals;只要可能含有任何维度的数组(包括 Object[] 中存了 int[]),就用 deepEquals。








