标签:microsoft 散列码 散列表 对象产生 散列 style 提高 比较 返回
在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。
hashCode的通用约定:
1 在程序的执行过程中,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数。
2 如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。
3 如果两个对象根据equals(Object)方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不一定要产生不同的整数结果。给不相等的对象产生不同的整数结果,可以提高散列表的性能。
因没有覆盖hashCode而违反的关键约定是第2条:相等的对象必须具有相等的散列码(hash code)。由于类没有覆盖hashCode方法,两个相等的实例调用hashCode方法返回的整数可能不相等。
一个好的散列函数为不相等的对象产生不相等的散列码。理想情况下,散列函数应该把集合中不相等的实例均匀地分布到所有可能的散列值上。31可用移位和减法来代替乘法,可以得到更好的性能:31*i==(i<<5)-i。
参考资料
《Effective Java 中文版 第2版》 第9条:覆盖equals时总要覆盖hashCode P39-43
标签:microsoft 散列码 散列表 对象产生 散列 style 提高 比较 返回
原文地址:http://www.cnblogs.com/WJQ2017/p/7647308.html