如何比较二维(或嵌套)Java数组?

10

根据Java文档中的Arrays.equals(Object[] a, Object[] a2)

如果两个指定的对象数组彼此相等,则返回true。当且仅当两个数组包含相同数量的元素,并且两个数组中相应位置的每个元素都相等时,这两个数组被认为是相等的。

但是当我运行下面的程序时,它输出为false

那么,Array类的equals方法是否不适用于多维数组呢?

我可以使用哪个API来实现以下程序的结果为true

public class Test {
    public static void main(String[] args) {
        String[][] rows1 = { new String[] { "a", "a" } };

        String[][] rows2 = { new String[] { "a", "a" } };

        System.out.println("Arrays.equals() = " + Arrays.equals(rows1, rows2));

    }
}

2
https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#deepEquals-java.lang.Object:A-java.lang.Object:A- - chrylis -cautiouslyoptimistic-
@chrylis,你应该把你的评论变成一个答案。 - Ridcully
4个回答

30
你正在比较两个二维数组,这意味着这些数组的元素本身就是数组。 因此,当比较元素(使用Objectequals)时,将返回false,因为Objectequals比较Object引用。
请改用Arrays.deepEquals
来自Javadoc:

boolean java.util.Arrays.deepEquals(Object[] a1, Object[] a2)

如果两个指定的数组彼此深层相等,则返回true。 与equals(Object [], Object [])方法不同,此方法适用于任意深度的嵌套数组。


8

Arrays.deepEquals().

为什么Arrays.equals不起作用呢?文档中说,数组必须具有相同数量的元素,并且这些元素必须相等。这两个数组确实具有相同数量的元素:1。每个元素都是另一个数组。

然而,这些数组使用常规的equals方法进行比较。对于任何对象,如果该对象未覆盖为Object定义的equals方法,则使用为Object定义的equals方法,该方法与==相同。数组不会覆盖equals(它们也不会覆盖toString(),这就是为什么我们必须使用Arrays.toString()来格式化数组的原因)。

Arrays.deepEquals()对元素为数组时进行特殊检查,然后使用递归的Arrays.deepEquals()测试这些数组是否相等。


0

它没有按预期工作,因为您正在使用new初始化两个不同的对象。

来自Java文档:

boolean java.util.Arrays.equals(Object[] a, Object[] a2)

如果两个指定的对象数组相等,则返回true。如果两个数组包含相同数量的元素,并且两个数组中对应的元素对相等,则认为这两个数组是相等的。如果e1和e2是两个对象,当且仅当(e1==null ? e2==null : e1.equals(e2))时,它们被认为是相等的。换句话说,如果它们以相同的顺序包含相同的元素,则这两个数组是相等的。此外,如果两个数组引用都为null,则认为它们相等。

参数:a要测试是否相等的一个数组a2要测试是否相等的另一个数组返回值:如果两个数组相等,则为true



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接