100%会用到的hashCode()和equals()方法及使用规范

发布时间 2023-03-23 09:17:53作者: 百里浅暮

阿里巴巴Java开发手册手册:

  • 只要重写 equals,就必须重写 hashCode。
  • 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法。
  • 如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals。

equals()的设计原则

  • 对称性:如果x.equals(y)返回是true,那么y.equals(x)也应该返回是true。
  • 反射性:x.equals(x)必须返回是true。
  • 类推性:如果x.equals(y)返回是true,而且y.equals(z)返回是true,那么z.equals(x)也应该返回是true。
  • 一致性:如果x.equals(y)返回是true,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是true。
  • 非空性:x.equals(null),永远返回是false;x.equals(和x不同类型的对象)永远返回是false。

hashCode()的设计原则

  • 在一个Java应用的执行期间,如果一个对象提供给equals做比较的信息没有被修改的话,该对象多次调用hashCode()方法,该方法必须始终如一返回同一个integer。
  • 如果两个对象根据equals(Object)方法是相等的,那么调用二者各自的hashCode()方法必须产生同一个integer结果。
  • 并不要求根据equals(java.lang.Object)方法不相等的两个对象,调用二者各自的hashCode()方法必须产生不同的integer结果。然而,程序员应该意识到对于不同的对象产生不同的integer结果,有可能会提高hash table的性能。

 

参考: