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

时间:2017-06-01 05:22:56

标签: java arrays

来自 Arrays.equals的Java文档(Object [] a,Object [] a2)

  

如果两个指定的Objects数组等于1,则返回 true   另一个。如果两个数组都包含,则认为两个数组相等   相同数量的元素和所有相应的元素对   在两个数组中是相等的。

但是当我运行下面的程序时,它正在打印false

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

在下面的程序中,我可以用什么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));

    }
}

4 个答案:

答案 0 :(得分:29)

您正在比较二维数组,这意味着这些数组的元素本身就是数组。因此,在比较元素时(使用Object的{​​{1}}),会返回equals,因为false的{​​{1}}比较Object引用。

改为使用equals

来自Javadoc:

  

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

     

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

答案 1 :(得分:8)

Arrays.equals

这就是equals无效的原因。正如文档所说,数组必须具有相同数量的元素,并且元素必须是等于的。数组确实具有相同数量的元素:1。每个元素都是另一个数组。

但是,将这些数组与常规equals方法进行比较。对于任何对象,如果对象没有覆盖为Object定义的equals方法,则使用为Object定义的equals方法,即与==相同。并且数组不会覆盖toString()(它们也不会覆盖Arrays.toString(),这就是我们必须使用Arrays.deepEquals()格式化数组的原因。

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

答案 2 :(得分:0)

由于您使用new初始化两个不同的对象,因此无法正常工作。

来自Java Docs:

  

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

     

如果两个指定的Objects数组等于1,则返回true   另一个。如果两个数组都包含,则认为两个数组相等   相同数量的元素和所有相应的元素对   在两个数组中是相等的。考虑两个对象e1和e2   等于if(e1 == null?e2 == null:e1.equals(e2))。换句话说,   如果两个数组包含相同的元素,则它们是相等的   订购。此外,如果两个数组引用都相同,则认为它们相等   空。

     

参数:一个要测试相等的数组a2另一个数组   要进行相等测试返回:如果两个数组相等则为true

答案 3 :(得分:0)