1、hashCode方法返回值是int类型的散列码,对象的散列码是为了更好的支持基于哈希机制的java集合类,例如Hashtable,HashMap,HashSet。如果重写equals方法,也要重写hashCode方法。
2、hashCode方法的一致约定要求
(1)、 在java应用的一次执行过程中,对于同一个对象的hashCode方法的多次调用,他们应该返回同样的值(前提是该对象的信息没有发生变化);
(2)、对于两个对象来说,如果使用equals方法比较返回true,那么这两个对象的hashCode值一定是相同的;
(3) 对于两个对象来说,如果使用equals方法返回false,那么这两个对象的hashCode值不要求一定不同(可以相同,可以不同),但是如果不同则可以提高应用的性能。
(4)、 对于Object类来说,不同Object对象的hashCode值是不同的(Object类的hashcode值表示的是对象的地址)。
3、 hashCode方法应用举例:
当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合对象中的hashCode值是否与增加的对象的hashCode值一致;如果不一致,直接加进去;如果一致,在进行equals方法比较,equals方法返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。
4、hashCode编写指导
在编写hashCode时,由于返回值是个int值,故不能溢出。不同对象的hash尽量不同,避免hash冲突。下面是解决方案:
- 定义一个int类型的变量hash,初始化为7。
- 接下来将你认为重要的字段(equals中衡量相等的字段)参与散列运算,每一个重要字段都会产生一个hash分量,为最终的hash值做出贡献
- 最后通过递归计算所有的分量的总和起,注意并不是简单的相加。选择一个倍乘的数字31,参与计算。
int hash = 7;
hash = 31 * hash + 字段1贡献分量;
hash = 31 * hash + 字段2贡献分量;
.....
return hash;
注释以上部分内容来自:
lulipro