hash hashcode变化_你所不知道的HashCode

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

大家可能印象比较深刻,当你打开源码时,会发现native修饰的方法会挡住你的去路。C++实现的方法难道就该让我们止步了吗?这次打算死磕到底。

二、源码揭秘

2.1 Object.hashCode()注释解读

简单归纳一下JDK团队的注释:

  • hashCode表示对象在hash表中的位置,对于同一个对象来说,多次调用,返回相同的hashCode。
  • 如果Object.equal()相等,O
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值