关于Java HashMap的实现

时间:2012-04-03 21:28:09

标签: java hashmap

为什么容量必须是倍数或2? 为何使用“&”在indexFor函数中? 为什么要重新计算散列函数中的散列而不是直接使用密钥的散列码?

我认为这个实现与“算法简介”的描述有一些重要的区别。

“>>>”是什么意思?

static int hash(int h) {
        // This function ensures that hashCodes that differ only by
        // constant multiples at each bit position have a bounded
        // number of collisions (approximately 8 at default load factor).
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
}

有人能给我一些指导吗?我很欣赏如果有人可以解释哈希算法。 非常感谢!

2 个答案:

答案 0 :(得分:5)

这是性能优化。将哈希代码映射到表索引的常用方法是

table_index = hash_code % table_length;

%运算符很贵。如果table_length是2的幂,则计算:

table_index = hash_code & (table_length - 1);

相当于(更多)更昂贵的模运算。

答案 1 :(得分:0)

不要理会幕后的男人。

实际算法无疑是开发人员“感觉良好”的组合,修复了一些奇怪的退化案例,以及简单的传统(用户经常会产生模糊的依赖)。

请注意:

 * Applies a supplemental hash function to a given hashCode, which
 * defends against poor quality hash functions.  This is critical
 * because HashMap uses power-of-two length hash tables, that
 * otherwise encounter collisions for hashCodes that do not differ
 * in lower bits. Note: Null keys always map to hash 0, thus index 0.

网:只要它有效且性能良好,你就不在乎了。