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
hashCode
和 equals
仅与密钥相关。它不对这个值做任何事情,它只是返回对它的引用。
【参考方案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 机制 [重复]的主要内容,如果未能解决你的问题,请参考以下文章