Java哈希映射机制

Java哈希映射机制,java,hashmap,Java,Hashmap,在Java中,如果我有HashMap映射,并且想要查找给定的int键,比如map.get(key),那么算法将计算key.hashCode(),转到相应的bucket,线性搜索int[]类型的对象,并使用equals()对它们进行比较?因此,bucket中的那些int[]对象将具有相同的键(由hashCode计算),它们将通过equals()进行比较。是这样吗 我在网上找不到一个能清楚显示的例子。只有文字 您重定向给我的内容不包含正常的可理解示例,我不需要理论。更正:…转到相应的存储桶,线性搜索

在Java中,如果我有
HashMap映射
,并且想要查找给定的
int键
,比如
map.get(key)
,那么算法将计算
key.hashCode()
,转到相应的bucket,线性搜索
int[]
类型的对象,并使用
equals()
对它们进行比较?因此,bucket中的那些
int[]
对象将具有相同的键(由
hashCode
计算),它们将通过
equals()
进行比较。是这样吗

我在网上找不到一个能清楚显示的例子。只有文字


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

更正:…转到相应的存储桶,线性搜索键(整数)等于给定键的条目。这就是这个搜索在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;
}
final Entry getEntry(对象键){
int hash=(key==null)?0:hash(key);
for(条目e=table[indexFor(hash,table.length)];e!=null;e=e.next){
对象k;
如果(e.hash==hash&((k=e.key)==key | |(key!=null&&key.equals(k)))
返回e;
}
返回null;
}

我认为,如果可以清楚地单独使用数据结构,那么将数组作为值混合使用,这不是一个好的解决方案。哈希映射的思想是压缩相对于表的索引。您可以轻松地将所有整数保存在一个单独的数据结构中,并使用for循环进行枚举,将密钥与put配对。无论引用存储在何处,此基础结构都将为您提供引用。

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

要查找探测键(在您的示例中为整数),它首先计算探测的哈希代码。它转到包含该哈希代码的存储桶。它扫描bucket中(key,value)对中的键,查找散列码与探测散列码匹配的键。它只对那些具有所需哈希代码的键运行equals测试

如果它找到一个(key,value)对,其key等于探测,它将返回值,在您的例子中是int[]引用


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

如果您有
HashMap
,则
get
将返回
int[]
。如果你真的想要数组中的某个元素,你必须自己搜索。@SophieSperner:在
HashMap
中,每个键只能有一个值。要获得每个键的更多值,您需要一个
MultiMap
。检查
hashCode
equals
仅与键相关。它对值没有任何作用,只是返回对它的引用。但是bucket中的所有键都是相同的,不是吗?这就是为什么我身边没有例子。我只是不明白。不,一个bucket包含所有(键、值)对,它们的键有一个散列码,该散列码属于分配给该bucket的一组散列码。