Java中的equals vs Arrays.equals

新手上路,请多包涵

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

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

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

原文由 PandaConda 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 755
2 个回答

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

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


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

原文由 Peter Lawrey 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏