Maps
Feb 27th, 2020 - Now
HashMap
Java 7
final int hash(Object k) {
int h = hashSeed;
if (0 != h && k instanceof String) {
return sun.misc.Hashing.stringHash32((String) k);
}
// 下面进行的是一个hash的扰乱
// 因为在下面我们直接与 length-1 与操作
// 如果不进行扰动会导致高位的贡献为0
// 所以这里是将高位部分 (h>>>20) 和中间位 (h>>>12)
// 和低位都进行了一个计算最后得到我们的数值
h ^= k.hashCode();
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
// indexFor函数获取当前的Object插入的下标
// 由于 Java 中初始化和扩容hash存储的数组都是 2的幂次
// 所以直接用 & (2^n-1) 代替 % 2^n 的操作
// 还有一个好处就是,取模操作对负数的支持不好
// 直接与操作保证了不会出现负数,无需考虑数组越界
static int indexFor(int h, int length) {
return h & (length-1);
}Java8
ConcurrentHashMap
Java7
Java8
HashTable (线程安全)
Java7
Reference
Last updated
