//put方法时候使用的扰动函数
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
//获取table中的位置
static int indexFor(int h, int length) {
return h & (length-1);
}
/**
1. 首先先复习一下 (与 &) (或 |) (异或 ^)
(与 &) : 运算规则 两个2进制都为 1 那么为1 否则为 0
(或 |) : 运算规则 两个2进制 其中一个为1 那么为1 否则为 0
(异或 ^) : 运算规则 两个2进制 相同则为 0 不同则为 1
开始计算
假设 key 的 hashCode 为 4026531845 那么 二进制为
key.hashCode() : 1111 0000 0000 0000 0000 0000 0000 0101
h >>> 16 : 0000 0000 0000 0000 1111 0000 0000 0000
//寻找位置
(h = key.hashCode()) ^ (h >>> 16) : 1111 0000 0000 0000 1111 0000 0000 0101
lenth-1 : 0000 0000 0000 0000 0000 0000 0000 1111
result : 0000 0000 0000 0000 0000 0000 0000 0101
//寻找位置的时候 : key的低16位和高16位进行异或运算,高位在低位中体现,扰乱,因为length是2的整数倍 length -1
会使低位都是 1 保证了 与 上之前的结果 ,保证了 低位的数据是之前运算的,并且出来的位置肯定是小于 table.size的
// result = 5
*/
HashMap hash方法与indexFor 方法
猜你喜欢
转载自blog.csdn.net/Summer_i/article/details/105730553
今日推荐
周排行