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性能的目的。

发布了19 篇原创文章 · 获赞 8 · 访问量 4040

猜你喜欢

转载自blog.csdn.net/u014068277/article/details/103951235