热门

最新

红包

立Flag

投票

同城

我的

发布
dekudekuku
八月份的天气
5 年前
truedekudekuku

HashMap会对他的Key做调用Hash()进行hash运算,这个和HashCode不同,
他让Key的HashCode值的高16位也参与路由运算,使它的值变得更加散列,减小hash碰撞
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}



h = key.hashCode()) ^ (h >>> 16)
1001 1101 0010 1101 1000 0000 1100 1001
^
0000 0000 0000 0000 1001 1101 0010 1101
=
1001 1101 0010 1101 1001 1101 1110 1101

CSDN App 扫码分享
分享
评论
点赞
打赏
  • 复制链接
  • 举报
下一条:
我们都知道map数组的大小是2的冥次方但是当我们用HashMap有参构造去自定义数组大小时,他是怎么把我们自定义的值转换为2的冥次方呢;HashMap给我们一个TableSizeFor() 方法,我觉得这个方法很巧妙他是用 按位或赋值操作符|=和位运算>>>来向上取2 的冥次方 static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }
立即登录