繁体   English   中英

为什么我们需要在java中重写equals和hashcode,为什么我们不能使用Object类实现

[英]why we need to override equals and hashcode in java and why cannot we use Object class implementation

伙计们请让我知道,在现实世界中我们为什么需要覆盖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', 'b', 'c'});
System.out.println(x.equals(y)); // Prints true

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

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

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

因为在real world如果使用Object的实现

new Integer( 1 )不等于new Integer( 1 )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM