java hashcode

hashCode的作用:

当向不允许重复的集合中插入对象时,如何判别在集合中是否已经存在该对象了?
1.采用 equals方法去逐一比较,效率必然是一个问题
2.利用hashcode提高效率.

实际上在HashMap的具体实现中会用一个table保存对象的hashcode ,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用 equals方法的次数就大大降低了

hashCode方法的存在是为了减少equals方法的调用次数,从而提高程序效率。
hashCode方法将对象内容映射成一个数值, 作为散列值

对于Java HotSpot VM,每个对象都会有一个header,header由两个机器字表示(8个字节对于32位架构,16个字节对于64位架构)。header的第一个字中有7位用做同步及垃圾收集,另外25位存储对象的hash码。header的第二个字存储指向对应Class对象的指针(Class对象用来保存类的元数据信息及方法表)。

猜测:hashCode可能返回的是储存的25位hash码

public int hashCode() {
        int result = status;
        result = 31 * result + (message != null ? message.hashCode() : 0);
        result = 31 * result + (data != null ? data.hashCode() : 0);
        return result;
    }

其实都是在使用31作为基数,把值转换为31进制,来获得更大的唯一性

1、 31 * N 会被编译器优化为=> 左移5位 - N
2、 质数能更好地保证与其他数相乘之后的唯一性
3、 研究人员发现,31能更好的分配key,减少碰撞,但是不知道为什么

equals方法和hashCode

应该保持逻辑上的一致关系

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值