加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

为什么我们需要在java中重写equals和hashcode,为什么我们不能使

发布时间:2020-12-15 04:52:37 所属栏目:Java 来源:网络整理
导读:伙计们请让我知道,在现实世界中我们为什么需要覆盖equals和hashcode,并且我们不能使用Object的equals和hashcode. 解决方法 Object的equals / hashcode实现很好 – 如果你想要“引用标识”作为你的相等.换句话说,on对象将始终与其自身相等,但与另一个对象不同
伙计们请让我知道,在现实世界中我们为什么需要覆盖equals和hashcode,并且我们不能使用Object的equals和hashcode.

解决方法

Object的equals / hashcode实现很好 – 如果你想要“引用标识”作为你的相等.换句话说,on对象将始终与其自身相等,但与另一个对象不同.

但是,如果您希望两个不同的对象相等,则必须覆盖该方法以说明它们应该如何相等(然后重写哈希码以使其与之一致).

最简单的例子可能是String.具有相同字符的两个不同字符串是相等的,并且它们相等非常有用:

String x = new String(new char[]{'a','b','c'});
String y = new String(new char[]{'a','c'});
System.out.println(x.equals(y)); // Prints true

现在将它与FileInputStream进行比较 – 什么会使两个FileInputStream相等?如果他们正在阅读同一个文件?文件中的位置怎么样?两个流到具有相同内容的不同文件怎么样? IMO提出这个问题并没有多大意义.

现在,Object实现如何知道FileInputStream和String的所需行为之间的区别?它可能会注意到添加到字段,属性和类型本身的注释,可能会自动生成适当的字节码,然后可以进行JIT编译……但当然Java在注释可用之前很久就出现了.当前的方法非常简单 – 但它确实意味着如果您希望不同对象的值相等,则需要自己编写代码.

需要注意的一点是,对于不可变类型,通常更容易考虑相等性 – 如果两个对象在一个时间点相等然后在之后不相等则会很奇怪.这也可能严重搞乱哈希表 – 哈希码基本上应该依赖于被认为是相等的对象的方面,并且当密钥首次被添加到哈希表时记录哈希码;如果您随后更改了密钥的内容,其哈希码将会更改,但哈希表不会知道它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读