如何在Java中比较两个对象数组?

12

我有两个对象数组,如下所示:

Object[] array1 = {0, 1, 2, 3};
Object[] array2 = {0, 1, 2, 3};

我想知道这两个数组是否相等。我定义相等为array1中每个位置上的值都与array2中对应位置上的值相同。因此,这两个数组是相等的。

什么是最好的方法来判断这两个数组是否相等?

if(array1 == array2) 

这不是一个深度相等,所以它不起作用,我不知道循环遍历每个元素并比较它们是否是解决这个问题的最佳且最有效的方法。是否有更好的建议?

编辑:我需要一个可以进入嵌套数组的equals。


1
我觉得没有任何方法能绕过“for-each”循环。为了让if语句正常工作,你可能想要定义自己的aryClass类,并提供一个isEqual()函数。但我知道你正在寻找更好的解决方案,所以我将把这个作为评论而不是答案。 - AudioDroid
6个回答

21
使用 Arrays.deepEquals()。该方法与Arrays.equals()相同,但也适用于嵌套数组。

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

如果两个数组引用都为null,或者它们引用包含相同数量的元素且两个数组中所有对应的元素对都是深度相等的,则认为这两个数组是深度相等的。

如果以下条件之一成立,则认为两个可能为空的元素e1和e2深度相等:

  • e1和e2都是对象引用类型的数组,并且Arrays.deepEquals(e1, e2)将返回true
  • e1和e2是相同基本类型的数组,并且适当的重载Arrays.equals(e1, e2)将返回true。
  • e1 == e2
  • e1.equals(e2)将返回true。

请注意,此定义允许在任何深度处有null元素。

如果两个指定的数组中包含自身作为元素,无论是直接还是间接地通过一个或多个级别的数组,此方法的行为都是未定义的。


@Op De Cirkel 我已经阅读了它,并将其添加到我的答案中。这种方法有什么问题吗? - Marcelo
不是的,如果你不需要它,deepEquals() 做了太多的事情(速度慢,因为它必须检查元素是否为数组)。无论如何,我放弃了那个踩。 - Op De Cirkel
@Op de Cirkel,你说得没错,但是OP没有说明数组中有什么类型的元素。我猜这只是问题的一部分答案。 - Marcelo
+1 是的,根据你的需求,可以使用 Arrays.equals()Arrays.deepEquals - Paŭlo Ebermann
我能够基于堆栈跟踪实现一个独特的类/方法/行/对象ID,谢谢! - Aquarius Power

9

java.util.Arrays.equals

   /**
     * Returns <tt>true</tt> if the two specified arrays of Objects are
     * <i>equal</i> to one another.  The two arrays are considered equal if
     * both arrays contain the same number of elements, and all corresponding
     * pairs of elements in the two arrays are equal.  Two objects <tt>e1</tt>
     * and <tt>e2</tt> are considered <i>equal</i> if <tt>(e1==null ? e2==null
     * : e1.equals(e2))</tt>.  In other words, the two arrays are equal if
     * they contain the same elements in the same order.  Also, two array
     * references are considered equal if both are <tt>null</tt>.<p>
     *
     * @param a one array to be tested for equality.
     * @param a2 the other array to be tested for equality.
     * @return <tt>true</tt> if the two arrays are equal.
     */
    public static boolean equals(Object[] a, Object[] a2) 

3
为了比较数组,我会使用Arrays.equals方法:
if (Arrays.equals(array1, array2))
{    
  // array1 and array2 contain the same elements in the same order
}

2
在您发布的示例中,数组实际上将包含Integer对象。在这种情况下,Arrays.equals()就足够了。但是,如果您的数组包含您的一些对象,则必须在您的类中实现equals(),以使Arrays.equals()正常工作。

0

array1.equals(array2) 应该可以给你想要的结果。


0

通常实用类java.util.Arrays非常有用。

  • 如果两个数组被认为是相等的,那么这两个数组包含相同数量的元素,并且两个数组中所有元素对都相等,则使用Arrays.equals
  • 如果两个数组引用被认为是深度相等的,如果两者都为null,或者它们引用包含相同数量的元素并且两个数组中所有对应的元素对都是深度相等的,则使用Arrays.deepEquals。此方法适用于任意深度的嵌套数组。

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