Java:如何测试数组相等?

时间:2011-11-08 13:24:49

标签: java arrays equality

为什么以下代码打印"Different."

boolean[][] a = { {false,true}, {true,false} };
boolean[][] b = { {false,true}, {true,false} };

if (Arrays.equals(a, b) || a == b)
    System.out.println("Equal.");
else
    System.out.println("Different.");

4 个答案:

答案 0 :(得分:71)

  

为什么以下代码打印"Different."

因为Arrays.equals执行比较。由于数组从equals继承了Object - 方法,因此将对内部数组执行身份比较,这将失败,因为ab没有引用相同的数组。

如果您更改为Arrays.deepEquals,则会按预期打印"Equal."

答案 1 :(得分:15)

这真的不明显。

首先,==运算符只是比较两个指针。由于ab是位于不同内存地址的不同对象,a == b将返回false(嘿,Java纯粹主义者,我知道==实际比较对象身份。我只是想说教。)

现在让我们来看看数组的equals()实现

boolean[] c = new boolean[] { false, true, false };
boolean[] d = new boolean[] { false, true, false };

if (c.equals(d)) {
    System.out.println("Equals");
} else {
    System.out.println("Not equals");
}

那会打印Not equals,因为没有数组实例实际实现equals()方法。所以,当我们调用<somearray>.equals(<otherarray>)时,我们实际上正在调用Object.equals()方法,它只是比较两个指针。

那就是说,注意你的代码实际上是这样做的:

boolean[] a0 = new boolean[] { false, true };
boolean[] a1 = new boolean[] { true, false };
boolean[] b0 = new boolean[] { false, true };
boolean[] b1 = new boolean[] { true, false };
boolean[][] a = new boolean[][] { a0, a1 };
boolean[][] b = new boolean[][] { b0, b1 };

if (Arrays.equals(a, b) || a == b)
    System.out.println("Equal.");
else
    System.out.println("Different.");

Arrays.equals(a, b)最终会调用a0.equals(b0)false将返回Arrays.equals(a, b)。因此,false也会返回Different.

因此,您的代码将打印{{1}},并且我们得出结论,Java等式有时会很棘手。

答案 2 :(得分:6)

对多维数组使用Arrays.deepEquals()。

答案 3 :(得分:0)

public static boolean equal(double[][] a, double[][] b) {
        if (a == null) {
            return (b == null);
        }
        if (b == null) {
            return false;  // already know 'a' isn't null
        }
        if (a.length != b.length) {
            return false;
        }
        for (int i = 0; i < a.length; i++) {
            if (!Arrays.equals(a[i], b[i])) {
                return false;
            }
        }
        return true;
    }
相关问题