MST

星途 面试题库

面试题:Java中HashMap哈希算法的基本原理

请简要描述Java HashMap中哈希算法是如何将键对象映射到哈希桶位置的,包括涉及到的主要步骤和关键操作。
44.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 获取键对象的哈希码
    • 首先调用键对象的hashCode()方法,这个方法是Object类的方法,每个Java对象都有。不同的对象如果内容不同,理想情况下应该返回不同的哈希码。例如:
    String key = "example";
    int hashCode = key.hashCode();
    
  2. 对哈希码进行扰动处理(在Java 8及以后)
    • 为了减少哈希冲突,HashMap对获取到的哈希码进行扰动处理。在Java 8中,HashMaphash方法实现如下:
    static final int hash(Object key) {
        int h;
        return (key == null)? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
    
    • 这里通过(h = key.hashCode()) ^ (h >>> 16),将哈希码的高位和低位进行异或操作,使得哈希分布更均匀,降低哈希冲突的概率。
  3. 计算哈希桶位置
    • 经过扰动处理后的哈希值,会与HashMap的容量(capacity)进行取模运算,得到该键值对应该存储的哈希桶位置。在Java中,为了提高效率,实际使用的是按位与操作(&)。因为HashMap的容量总是2的幂次方,n & (length - 1)等价于n % length,且按位与操作效率更高。例如:
    int hash = hash(key);
    int bucketIndex = hash & (table.length - 1);
    
    • 这样就确定了键对象在HashMap中对应的哈希桶位置。