![cf12098707cb66cf25be554ef3400ede.png](https://i-blog.csdnimg.cn/blog_migrate/91c2d2d62c89e41d458ccc342104f49c.jpeg)
一、什么是hashCode?
hashCode是通过一种hash算法计算,并返回int类型的值,典型的hash算法:
1、Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2、String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。
3、Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。
(摘自“百度百科”)
二、hashCode的作用?
Java中类的hashCode是使用在类似哈希表的数据结构中的,如HashMap、HashSet、HashTable等,用于定位元素的位置,在其它地方没有什么意义!
三、为什么要重写hashCode()?
Java中,Object是所有类的祖先,所以我们来看下Object中的hashCode(),源码如下:
/**
可见,hashCode()方法是native方法,其返回值是int;既然是native方法,那么查看hashCode的jvm源码,从中分析,不难得出有以下几种实现:
- 随机数
- 基于内存地址生成
- 固定值:1,用来测试
- 自增
- 利用位移生成随机数
jvm中生成hashCode源码:
![b46efa0284067011739329a78d457512.png](https://i-blog.csdnimg.cn/blog_migrate/feabc852c4cd89735aedac95e05f30d0.jpeg)
可以看到除了第三种,其余的算法都不具有一致性。那么当我们没有重写Object.hashCode()的时候,JVM是怎么存储生成的hashcode呢?弄清楚这个问题之前,我们先要了解jvm中的对象头。
四、对象头
jvm 将这种方式生成的hashcode存到了Java对象头里,对象头只是存储Object.hashCode()方法生成的hashCode。如果我们重写hashCode()方法便不需要存到对象头,就是说,如果你不重写hashCode()方法,那么jvm给我们提供了一种默认的生成hashCode的方法,生成的hashCode就存储在了对象头里。
http://weixin.qq.com/r/5Tmiug-EZVIarUvZ92z3 (二维码自动识别)