![29eb4813345e908e32bd3b3426f31554.png](https://img-blog.csdnimg.cn/img_convert/29eb4813345e908e32bd3b3426f31554.png)
引言
这两天有个学弟问过我这个问题:对象的 hashCode到底是怎么实现的?
在深挖之前,我可能只能说:如果没有被重载,代表的是对象的地址通过某种hash算法计算后在hash表中的位置。
回答后,仔细一想,不对呀,这个hash值具体是怎么计算的,我终究还是 没有答到点上,而是绕开话题,回答了含义。
脑壳一热,忽然想起去年虐我的阿里面试题,hashCode是怎么得到的呢?
文章导读
- 问题定义
- 源码揭秘
- String、Lombok对hashCode的实现
一、问题定义
hashCode真的只是通过地址计算的吗?如果对象地址变化了,比如经历的GC,hashCode是不是也跟着变了呢?如果此时刚好在进行锁升级,对于hashCode的计算会有影响吗?多线程的情况下会不会生成一样的hashCode呢?具体通过什么样的hash算法得到的呢?相比之下,我真的是太皮毛了~
首先看下一个简单的实现类,这里先别使用lombok注解,原因后文会解释:
public class Student {
private int no;
private String name;
public void setNo(int no) {
this.no = no;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Student student1=new Student();
student1.setName("张三");
student1.setNo(12);
System.out.println(student1.hashCode());
}
}
多次运行后,可以大胆假设hashCode的计算是稳定的。只要对象的引用不变,每次运行都是相同的结果,所以网上说使用随机数计算的回答,这个先打一个问号。
![dc8cb805ef4f05d292afd6bc8071ebb8.png](https://img-blog.csdnimg.cn/img_convert/dc8cb805ef4f05d292afd6bc8071ebb8.png)
大家可能印象比较深刻,当你打开源码时,会发现native修饰的方法会挡住你的去路。C++实现的方法难道就该让我们止步了吗?这次打算死磕到底。
二、源码揭秘
2.1 Object.hashCode()注释解读
简单归纳一下JDK团队的注释:
- hashCode表示对象在hash表中的位置,对于同一个对象来说,多次调用,返回相同的hashCode。
- 如果Object.equal()相等,O