对象的equals / hashpre实现很好-如果您希望“引用身份”作为相等性。换句话说,一个对象总是会比较等于自己,但不同于另一个对象。
但是,如果希望两个不同的对象相等,则必须重写该方法以 说明 它们应 如何 相等(然后重写哈希码以使其与之保持一致)。
最简单的示例可能是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实现如何知道所需的行为
FileInputStream和之间的区别
String?它 可能
会注意到添加到字段,属性和类型本身的注释,可能会自动生成适当的字节码,然后可以对其进行JIT编译……但是,当然Java早在可用注释之前就出现了。当前的方法非常简单-
但这确实意味着,如果要为不同的对象实现值相等,则需要自己编写代码。
需要注意的一点是,对于不可变类型,通常通常更容易考虑相等性-如果两个对象在某个时间点相等,然后在以后不相等,这很奇怪。这也可能会严重破坏哈希表-
哈希码应基本上取决于对象的各个方面,这些方面考虑是否相等,并且在首次将密钥添加到哈希表时记录哈希码;如果您随后 更改
键的内容,则其哈希码将更改,但哈希表将不知道它。



