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

时间:2010-06-12 12:48:32

标签: java equals hashcode

伙计们请让我知道,在现实世界中,为什么我们需要覆盖equals和hashcode,并且我们不能使用Object的equals和hashcode。

2 个答案:

答案 0 :(得分:10)

对象的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在注释可用之前很久就出现了。当前的方法非常简单 - 但它确实意味着如果您希望不同对象的值相等,则需要自己编写代码。

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

答案 1 :(得分:2)

因为在real world中使用了Object的实现

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