Java HashMap 机制 [重复]

Posted

技术标签:

【中文标题】Java HashMap 机制 [重复]【英文标题】:Java HashMap mechanism [duplicate] 【发布时间】:2013-03-04 10:32:49 【问题描述】:

在 Java 中,如果我有 HashMap<Integer, int[]> map 并想查找给定的 int key,例如 map.get(key),那么算法将计算 key.hashCode(),转到相应的存储桶并线性搜索 int[] 类型的对象并使用 equals() 比较它们?因此,桶中的那些int[] 对象将具有相同的键(由hashCode 计算),它们将由equals() 进行比较。对吗?

我在网上找不到一个例子,它显示得很清楚。只有文字。

您要重定向我的内容不包含正常可理解的示例,我不需要理论。

【问题讨论】:

如果您有HashMap<Integer, int[]>,那么get 将返回int[]。如果您确实想要该数组中的某些元素,则必须自己搜索。 grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/… @SophieSperner:在HashMap 中,每个键只能有一个值。对于每个键的更多值,您需要MultiMap 检查***.com/questions/6493605/how-does-java-hashmap-work hashCodeequals 仅与密钥相关。它不对这个值做任何事情,它只是返回对它的引用。 【参考方案1】:

更正: ...转到相应的存储桶并线性搜索键(整数)等于给定键的条目。这就是这个搜索在 HashMap 中的实际实现方式

final Entry<K,V> getEntry(Object key) 
    int hash = (key == null) ? 0 : hash(key);
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) 
        Object k;
        if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
            return e;
    
    return null;

【讨论】:

【参考方案2】:

当您可以清楚地单独使用数据结构时,我认为这不是将数组混合为值的好解决方案。哈希映射的想法是相对于表压缩索引。您可以轻松地将所有整数保存在单独的数据结构中,并使用 for 循环进行枚举,并将键与 put 配对。无论引用存储在何处,此底层构造都会为您提供引用。

【讨论】:

【参考方案3】:

有 2^32 个可能的哈希码,但桶的最大数量是Integer.MAX_VALUE,最大可能的 int。这意味着 HashMap必须将多个哈希码映射到同一个存储桶。

要查找探测键(在您的情况下为整数),它首先计算探测的哈希码。它进入包含该哈希码的存储桶。它扫描桶中(键,值)对中的键,以查找其哈希码与探测哈希码匹配的键。它只对那些确实具有所需哈希码的键运行 equals 测试。

如果它找到一个 (key, value) 对,其键等于探测,它会返回该值,在您的情况下是一个 int[] 引用。

有关处理 null 的详细信息,请参阅@Evgeniy 的答案中引用的代码。

【讨论】:

但是一个桶里面的所有key都是一样的,不是吗?这就是为什么我忍受周围没有例子的原因。我只是不明白。 不,存储桶包含 所有(键、值)对,其键的哈希码属于分配给该存储桶的一组哈希码。跨度>

以上是关于Java HashMap 机制 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

集合之HashTable

JAVA数据结构——Map之HashMap

java并发造成HashMap非线程安全的原因

对java中hashmap深入理解

java在hashmap初始化时赋初值

Map...---HashMap和Hashtable的区别-----...LinkedHashMap