identityHashCode 与 hashcode 的区别

System.identityHashCode

返回给定对象的哈希码,该代码与默认的方法 hashCode() 返回的代码一样,无论给定对象的类是否重写 hashCode()。null引用的哈希码为 0。

obj.hashcode

hashCode()方法是顶级类Object类的提供的一个方法,所有的类都可以进行对hashCode方法重写。这时hash值计算根据重写后的hashCode方法计算

如果在没有重写hashcode的前提下,hashcode的返回值等于identityHashCode的返回值

有哪些特点?

  1. 一个对象在其生命期中 identity hash code 必定保持不变;
  2. 如果a == b,那么他们的System.identityHashCode() 必须相等;如果他们的System.identityHashCode() 不相等,那他们必定不是同一个对象;
  3. 如果System.identityHashCode() 相等的话,并不能保证 a == b(毕竟这只是一个散列值,是允许冲突的);

有什么作用?
加速对象去重:由特征2可知,只要判断出两个对象的hashCode不一致,就知道这两个对象不是同一个;又因为hashCode()的性能比 " == "性能高得多,所以多数时候,用它来判断重复。

扩展:为啥hashCode()性能高?
因为hashCode()的结果算出来后缓存起来,下次调用直接用不需要重新计算,提高性能

验证:

    public static void main(String [] args) throws Exception{
        CA ca = new CA();
        CA cb = new CA();
        CA cc= ca;

        System.out.println("ca identityHashCode:" + System.identityHashCode(ca) + ", ca hashcode:"+ca.hashCode());
        System.out.println("cb identityHashCode:" + System.identityHashCode(cb) + ", ca hashcode:"+cb.hashCode());
        System.out.println("cc identityHashCode:" + System.identityHashCode(cc) + ", ca hashcode:"+cc.hashCode());

        //注意这里是new Sting,而不是aa,因为常亮aa在赋值的时候系统会优化,sb和sc指向字符串缓冲区域的aa,所以sb = sc
        String sa = new String("aa");
        String sb = "aa";
        String sc = "aa";

        System.out.println("sa identityHashCode:" + System.identityHashCode(sa) + ", ca hashcode:"+sa.hashCode());
        System.out.println("sb identityHashCode:" + System.identityHashCode(sb) + ", ca hashcode:"+sb.hashCode());
        System.out.println("sc identityHashCode:" + System.identityHashCode(sc) + ", ca hashcode:"+sc.hashCode());
		
		System.out.println("sa == sb ? "+ (sa == sb ? "true":"false") + ", sb == sc ? "+(sb == sc ? "true":"false"));
    }
    
输出:
ca identityHashCode:21685669, ca hashcode:21685669
cb identityHashCode:2133927002, ca hashcode:2133927002
cc identityHashCode:21685669, ca hashcode:21685669
sa identityHashCode:1836019240, ca hashcode:3104
sb identityHashCode:325040804, ca hashcode:3104
sc identityHashCode:325040804, ca hashcode:3104
sa == sb ? false, sb == sc ? true

结果分析:

  1. 从ca,cb,cc的输出可以看出,CA没有重写HashCode,所以identityHashCode和hashCode是相等的。
  2. sa,sb,sc的hashCode是相同的,是因为String类重写了hashCode方法,它根据String的值来确定hashCode的值,所以只要值一样,hashCode就会一样。
  3. 如果identityHashCode 不相等,那他们必定不是同一个对象

参考博客:
https://www.jianshu.com/p/24fa4bdb9b9d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值