(注意)数组比较方法笔记

1. x == y(引用比较)

  • 本质:比较两个数组变量的内存地址是否相同

  • 核心逻辑:判断是否指向内存中同一个数组对象

  • 适用场景:检查两个数组变量是否引用同一个实例

  • 示例

    1
    2
    3
    4
    5
    6
    int[] a = {1,2,3};
    int[] b = a; // 指向同一对象
    int[] c = {1,2,3};// 新对象,内容相同但地址不同

    a == b → true
    a == c → false
  • 特点:与数组类型无关,仅关注引用是否相同

2. x.equals (y)(数组对象的 equals 方法)

  • 本质:继承自 Object 类的 equals 方法,等价于 x == y

  • 核心逻辑:同样比较引用地址,而非数组内容

  • 适用场景:同 x == y,无实际额外价值

  • 示例

    1
    2
    a.equals(b) → true(同x == y)
    a.equals(c) → false(同x == y)
  • 特点:数组未重写 equals 方法,行为与 == 完全一致

3. Arrays.equals (x, y)(一维内容比较)

  • 本质:比较两个数组的内容是否完全一致

  • 核心逻辑

    • 先比较数组长度是否相同
    • 再逐一比较对应位置元素是否相等
    • 对对象数组会调用元素的 equals () 方法
  • 适用场景:一维数组的内容比较(基本类型 / 对象类型均可)

  • 示例

    1
    2
    3
    4
    5
    6
    int[] x = {1,2,3};
    int[] y = {1,2,3};
    int[] z = {1,3,2};

    Arrays.equals(x,y) → true(长度+元素全相同)
    Arrays.equals(x,z) → false(元素顺序不同)
  • 局限性:不支持多维数组(会比较子数组引用而非内容)

4. Arrays.deepEqual (x, y)(深度内容比较)

  • 本质:递归比较数组内容,支持多维数组

  • 核心逻辑

    • 对一维数组:行为同 Arrays.equals ()
    • 对多维数组:递归比较每个子数组的内容
  • 适用场景
    - 多维数组的内容比较
    - 包含数组类型元素的对象数组比较

  • 示例

    1
    2
    3
    4
    5
    6
    int[][] m1 = {{1,2}, {3,4}};
    int[][] m2 = {{1,2}, {3,4}};
    int[][] m3 = {{1,2}, {4,3}};

    Arrays.deepEqual(m1,m2) → true(深层内容相同)
    Arrays.deepEqual(m1,m3) → false(子数组内容不同)
  • 特点:唯一能正确比较多维数组内容的方法

对比总结表

方法 比较对象 适用场景 多维数组支持 核心特点
x == y 引用地址 判断是否同一对象 不支持 最基础的内存地址比较
x.equals(y) 引用地址 同 x == y 不支持 与 == 完全等价,无特殊作用
Arrays.equals(x,y) 一维数组内容 比较一维数组是否完全相同 不支持 只比较表层元素,不递归
Arrays.deepEqual(x,y) 深层内容 多维数组内容比较 支持 递归比较所有层级的元素内容

关键使用原则

  1. 判断是否同一数组对象 → 用 x == y(或 x.equals (y),但推荐前者)
  2. 比较一维数组内容 → 用 Arrays.equals (x,y)
  3. 比较多维数组内容 → 必须用 Arrays.deepEqual (x,y)
  4. 内容比较时,顺序不同则认为不相等(均为顺序敏感比较)