在Java中比较数组时,以下2个语句之间有什么区别吗?
Object[] array1, array2;
array1.equals(array2);
Arrays.equals(array1, array2);
如果是这样,它们是什么?
原文由 PandaConda 发布,翻译遵循 CC BY-SA 4.0 许可协议
在Java中比较数组时,以下2个语句之间有什么区别吗?
Object[] array1, array2;
array1.equals(array2);
Arrays.equals(array1, array2);
如果是这样,它们是什么?
原文由 PandaConda 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是一个臭名昭著的问题: .equals()
因为数组严重损坏,永远不要使用它。
也就是说,它并没有像“有人以一种非常错误的方式完成它”那样“损坏”——它只是在做定义的事情,而不是通常预期的事情。所以对于纯粹主义者来说:它非常好,这也意味着 永远不要使用它。
现在 equals
的预期行为是比较数据。默认行为是比较身份,因为 Object
没有任何数据(对于纯粹主义者:是的,但不是重点);假设是,如果您需要 equals
在子类中,您将实现它。在数组中,没有适合你的实现,所以你不应该使用它。
所以不同之处在于, Arrays.equals(array1, array2)
如您所料 工作(即比较内容), array1.equals(array2)
退回到 Object.equals
实现,从而比较身份最好用 ==
代替(对于纯粹主义者:是的,我知道 null
)。
问题是,即使 Arrays.equals(array1, array2)
如果数组元素没有正确实现 equals
--- 也会咬你一口。我知道这是一个非常幼稚的说法,但有一个非常重要但不太明显的情况:考虑一个二维数组。
Java 中的二维数组是数组的数组,数组的 equals
已损坏(如果您愿意,也可以无用),因此 Arrays.equals(array1, array2)
不会像您预期的那样在二维数组上工作。
原文由 alf 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
array1.equals(array2)
与array1 == array2
相同,即它是同一个数组。正如@alf 指出的那样,这不是大多数人所期望的。Arrays.equals(array1, array2)
比较数组的内容。同样
array.toString()
可能不是很有用,你需要使用Arrays.toString(array)
。