Java 如何在HashMap中确定桶号

Java 如何在HashMap中确定桶号,java,hashmap,Java,Hashmap,当我们将键值对存储在hashmap中时,HaspMap会查找一个键的hashcode,并将该对存储在标识符为键的hashcode的bucket中 一个bucket可以有多对键值。如果一个bucket可以保留多对键值,那么那些互不相似但仍共享相同哈希代码的键值呢 同一个bucket的不同键如何具有相同的hashcode。。。?我可以知道它是怎么工作的吗 同一个bucket的不同键如何具有相同的hashcode hashCode()契约并没有说两个不相等的对象可能没有相同的hashCode。 如果两

当我们将键值对存储在hashmap中时,HaspMap会查找一个键的hashcode,并将该对存储在标识符为键的hashcode的bucket中

一个bucket可以有多对键值。如果一个bucket可以保留多对键值,那么那些互不相似但仍共享相同哈希代码的键值呢

同一个bucket的不同键如何具有相同的hashcode。。。?我可以知道它是怎么工作的吗

同一个bucket的不同键如何具有相同的hashcode

hashCode()
契约并没有说两个不相等的对象可能没有相同的hashCode。

如果两个对象具有相同的hashcode,则它们位于同一个bucket中,但是
HashMap
不仅依赖于
hashcode()
,它还依赖于
equals()
方法来计算两个键是否相等。
这意味着映射会在bucket的每个元素中查找,以查看元素是否在使用输入键时在
equals()
方面相等。
如果元素的输入键是
equals()
,则这些键是相等的。
这就是为什么建议减少哈希代码冲突的原因,因为它支持迭代查找而不是哈希查找。

以下是在
HashMap
(Java 8)中定义的私有
getNode()
方法,该方法从映射中检索密钥:

final Node<K,V> getNode(int hash, Object key) {
    Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
    if ((tab = table) != null && (n = tab.length) > 0 &&
        (first = tab[(n - 1) & hash]) != null) {
        if (first.hash == hash && // always check first node
            ((k = first.key) == key || (key != null && key.equals(k))))
            return first;
        if ((e = first.next) != null) {
            if (first instanceof TreeNode)
                return ((TreeNode<K,V>)first).getTreeNode(hash, key);
            do {
                if (e.hash == hash &&
                    ((k = e.key) == key || (key != null && key.equals(k))))
                    return e;
            } while ((e = e.next) != null);
        }
    }
    return null;
}
final节点getNode(int散列,对象键){
节点[]选项卡;节点第一,e;int n;K;
如果((tab=table)!=null&(n=tab.length)>0&&
(first=tab[(n-1)&散列]!=null){
如果(first.hash==hash&&//始终检查第一个节点
((k=first.key)==key | |(key!=null&&key.equals(k)))
先返回;
if((e=first.next)!=null){
if(树节点的第一个实例)
return((TreeNode)first).getTreeNode(hash,key);
做{
如果(e.hash==hash&&
((k=e.key)==key | |(key!=null&&key.equals(k)))
返回e;
}而((e=e.next)!=null);
}
}
返回null;
}

您可以看到,只有当映射的
hashcode()
值相同并且这些值是“
equals()

时,映射的键才与输入键匹配,因为这就是哈希代码的用途。有意义吧。。!!你能解释一下你说的“它支持迭代查找而不是散列”吗?我不明白。第二,是什么让不同的键产生相同的哈希代码。。?第三,我们如何在HashMap中获得现有的hashcodes列表,而不是键。。?谢谢:)“是什么让不同的键产生相同的哈希代码”这是一个简单的计数问题。只有2^32个不同的哈希代码,但可以哈希的对象更多。因此很明显,一定会发生一些冲突。1.如果同一个bucket中有很多元素,则map必须迭代所有元素,以确定输入键是否与bucket中的一个元素相等(我在Illustrate中添加了代码)。2.实现
hashCode()
int
范围的方法。即使它设计得很好,能够在对象之间提供良好的分布,它也可能不是完美的。这通常是速度和分配之间的权衡。有一些碰撞通常不是问题。有足够频繁的碰撞是很重要的。3.当然检索键(
keySet()
)并对每个键调用
hashCode()