equals vs Arrays.equals in Java

2022-08-31 05:48:34

在Java中比较数组时,以下2个语句之间有什么区别吗?

Object[] array1, array2;
array1.equals(array2);
Arrays.equals(array1, array2);

如果是这样,它们是什么?


答案 1

array1.equals(array2)与 相同,即它是否是相同的数组。正如@alf指出的那样,这不是大多数人所期望的。array1 == array2

Arrays.equals(array1, array2)比较数组的内容。


同样,可能不是很有用,您需要使用。array.toString()Arrays.toString(array)


答案 2

这是一个臭名昭著的问题:因为数组严重损坏,永远不要使用它。.equals()

也就是说,它并不像“有人以一种非常错误的方式做了这件事”那样“破碎”——它只是在做定义的事情,而不是通常期望的事情。所以对于纯粹主义者来说:这完全没问题,这也意味着,永远不要使用它。

现在的预期行为是比较数据。默认行为是比较身份,因为没有任何数据(对于纯粹主义者:是的,它有,但这不是重点);假设是,如果你需要在子类中,你会实现它。在数组中,没有适合您的实现,因此您不应该使用它。equalsObjectequals

因此,区别在于,按照您的期望工作(即比较内容),回退到实现,这反过来又比较了身份,因此更好地替换为(对于纯粹主义者:是的,我知道)。Arrays.equals(array1, array2)array1.equals(array2)Object.equals==null

问题是,如果数组的元素不能正确实现,甚至会咬你一口。我知道这是一个非常幼稚的说法,但有一个非常重要的不太明显的案例:考虑一个2D数组。Arrays.equals(array1, array2)equals

Java中的2D数组是数组的数组,数组是损坏的(或者如果您愿意,则无用),因此在2D数组上不会像您期望的那样工作。equalsArrays.equals(array1, array2)

希望有所帮助。