问:Java 中为什么重写 equals(str) 方法时尽量要重写 hashCode() 方法?
答:这是一个检测实际项目踩坑经验的题目,因为我们经常会犯的一个很常见而又低级的错误根源在于重写 equals 方法时没有重写 hashCode 方法。自定义类重写 equals 方法是用来进行等值比较,重写 compareTo 方法是用来进行不同对象大小比较,而重写 hashCode 方法是为了将数据存入 HashSet、HashMap、Hashtable 等基于哈西表的集合类时进行高效比较。
当 equals 方法被重写时通常有必要重写 hashCode 方法来维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码,如果不这样做的话就会违反 hashCode 方法的常规约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括 HashMap、HashSet、Hashtable 等。
hashCode 方法的常规约定如下:
程序执行期间只要对象 equals 方法比较操作所用到的信息没有被修改,则对这同一个对象无论调用多次 hashCode 方法都必须返回同一个整数。
如果两个对象根据 equals 方法比较是相等的则调用这两个对象中任意一个对象的 hashCode 方法都必须产生同样的整数结果。
如果两个对象根据 equals 方法比较是不相等的,则调用这两个对象中任意一个对象的 hashCode 方法不一定要产生相同的整数结果(尽量保证不相等的对象产生截然不同的整数结果是可以提高散列表性能的)
|