在Java中,如果我有HashMap<Integer, int[]> map
并希望查找给定的int key
map.get(key)
,那么算法将计算key.hashCode()
,转到相应的存储桶并搜索线性地为int[]
类型的对象,并使用equals()
进行比较?因此,存储桶中的int[]
个对象将具有相同的密钥(由hashCode
计算),并且它们将由equals()
进行比较。是吗?
我在网上找不到一个清楚显示的例子。只有文字。
你重定向我的内容并不包含正常可理解的例子,我不需要理论。
答案 0 :(得分:2)
更正:...转到相应的存储桶并线性搜索一个条目,其中键(整数)等于给定的键。这就是这个搜索在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;
}
答案 1 :(得分:0)
当您可以单独清楚地使用数据结构时,我认为这不是将数组混合为值的良好解决方案。哈希映射的想法是相对于表压缩索引。您可以轻松地将所有内容保存在单独的数据结构中,并使用for循环进行枚举,并将密钥与put配对。无论引用存储在何处,此基础构造都将为您提供参考。
答案 2 :(得分:0)
有2 ^ 32个可能的哈希码,但最大桶数为Integer.MAX_VALUE
,最大可能的int。这意味着HashMap 必须将多个哈希码映射到同一个存储桶。
要查找探测键,在您的情况下为Integer,它首先计算探测器的哈希码。它转到包含该哈希码的存储桶。它扫描存储桶中(键,值)对中的键,以查找其哈希码与探测器哈希码匹配的键。它只对那些具有所需哈希码的密钥运行equals测试。
如果找到一个(key,value)对,其键与探测器相等,则返回该值,在您的情况下为int []引用。
有关处理null的详细信息,请参阅@ Evgeniy的答案中引用的代码。