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

伙计们请让我知道,在现实世界中我们为什么需要覆盖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进行比较 – 什么会使两个FileInputStreams相等? 如果他们正在阅读同一个文件? 文件中的位置怎么样? 两个流到具有相同内容的不同文件怎么样? IMO提出这个问题并没有多大意义。

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

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

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

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