第9条 覆盖equals时总要覆盖hashCode
- 定义:在每个覆盖了equals方法的类中,也必须覆盖hashCode方法
JavaSE6的约定
- 1.程序的一次执行中,equals比较用到的信息没被修改,hashCode必须返回同一整数。
- 2.同一程序多次执行过程中,每次执行返回的整数可以不一致。
- 3.两个对象的equals方法比较是相等的,两个对象中的任意一个hashCode必须产生相同整数。
- 4.两个对象的equals方法不相等,hashCode不一定不相等。
如果不覆盖hashCode的结果
- 违反第3条:相等的对象必须具有相等的hashCode。
解决方案
- 一个好的hashcode方法将会为不同的对象产生不同的hashcode。
- 在最理想的情况下,应该把集合中所有不相等的对象均匀分布到所有可能的值上。
- 在hashcode的计算过程中,可以将冗余域(即可以通过参与计算的其它值计算出来的值)排除在外。
- 还有必须排除equals方法中没有的所有值,否则有可能出现两个对象逻辑相等但是生成的不同的状况。
- 如果一个类中参与hashcode计算的变量都是不可变(final)的,而且hashcode计算的开销又非常大,那么可以在创建这个对象,或第一次使用hashcode时计算这个值,然后将hashcode保存在这个对象内部。
注意
- 不要试图从散列码计算中排除掉一个对象的关键部分来提高性能。
- 虽然这样得到的散列函数运行起来可能更快,但是他的效果不见得会好,可能会导致散列表慢到根本无法使用。