hash(key)的作用

问题

今日一问:我们知道,Object类的hashCode()函数是用来在哈希表里将对象映射成int值的,然后根据这个int值计算出哈希值从而确定其在哈希表里的位置,在Hashtable里能看到他是这么做的:

int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;

但是在HashMap里,

static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
putVal(hash(key), key, value, false, evict)
tab[i = (n - 1) & hash]

可以看到他是先调用了hash(key)这个函数然后做的之后的处理,今天的问题是,这个函数预处理一下hashcode有什么作用?
ps:请勿回答空指针,这不是本题想问的。

答案

这个函数很简单,就是使用hashcode的高位与低位做了一次异或运算,那么他的作用是什么呢?

这个问题要从HashMap的性能说起。我们知道,HashMap的查找以及添加的性能完全与当前哈希值所对应链表的长度有关,而链表的长度就是当前HashMap所保存的数据的哈希值为这个的个数,而HashMap的哈希值使用的是hash(key)除以tab长度(一定是2的指数)的余数,也就是hash(key)的低位数,所以这个方法使用高位与地位一起做了一次异或运算,能增加低位的无序程度,降低哈希值相等的可能,从而达到提升HashMap性能的目的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值