Java HashMap<;K、 V>;仅通过hashCode()实现

Java HashMap<;K、 V>;仅通过hashCode()实现,java,dictionary,Java,Dictionary,我刚刚意识到HashMap检查k.hashCode()=key.hashCode()和k==key 因此,无论k是否“等同于”键,k必须是==键 是否可以更改此行为以仅使用hashCode()等效?否hashCode为您进行分组(将元素放入存储桶中),在存储桶中使用equals进行比较 检查以下链接: 是否可以更改此行为以仅使用hashCode()等效 是的,当两个比较对象具有相同的hashCode()时,可以重写equals以返回true。这是否有意义是另一回事 public class So

我刚刚意识到
HashMap
检查
k.hashCode()=key.hashCode()
k==key

因此,无论
k是否“等同于”键
k必须是==键


是否可以更改此行为以仅使用
hashCode()
等效?

hashCode
为您进行分组(将元素放入存储桶中),在存储桶中使用
equals
进行比较

检查以下链接:

是否可以更改此行为以仅使用hashCode()等效

是的,当两个比较对象具有相同的
hashCode()
时,可以重写
equals
以返回true。这是否有意义是另一回事

public class SomeKeyClass
{
    boolean equals (Object other)
    {
        if (!(other instanceof SomeKeyClass)) // you can skip this condition too, but it
                                              // makes sense to require the two objects to
                                              // be of the same class in order for them to
                                              // be equal
            return false;
        return hashCode () == other.hashCode ();
    }
}
因此,无论
k
是否“等效”于
k
必须是
==

不,这是不正确的,因为@Kevinwall已经被观察到了
HashMap
使用
hashCode()
来标识正确的哈希桶,并使用
equals()
而不是
=
来比较落入同一桶中的键。具有不同实例等效意义的类型应该通过其
equals()
方法来描述,而标准库类型(如
String
Integer
实际上就是这样做的。当键属于这种类型时,不必使用与存储值相同的对象从
HashMap
中检索值

另一方面,没有意义的类型(不同的实例是等效的)不应该也通常不应该重写
equals()
(或
hashCode()
)。继承自
对象
的实现产生与
=
操作符相同的结果,这使得使用诸如
HashMap
键之类的对象或将它们存储在
HashSet
中成为可能和明智的选择,至少在某些情况下是如此

是否可以更改此行为以仅使用hashCode()等效

在这方面,无法更改
HashMap
的行为。如果您能够这样做,则生成的映射将无法正确地履行
map
契约。但是,您可以实现自己的类似于映射的类,该类的行为与您所描述的一样,或者您可以创建一个包装器类来用作替换键类型

关键类示例:

class HashEquivalenceKey<T> {
    private final T object;

    public HashEquivalenceKey(T object) {
        this.object = object;
    }

    public int hashCode() {
        return ((o == null) ? 0 : object.hashCode());
    }

    public boolean equals(Object o) {
        return ((o != null) && (this.hashCode() == o.hashCode()));
    }
}
类HashEquivalenceKey{
私人最终目标;
公共HashEquivalenceKey(T对象){
this.object=对象;
}
公共int hashCode(){
返回((o==null)?0:object.hashCode());
}
公共布尔等于(对象o){
返回((o!=null)&&(this.hashCode()==o.hashCode());
}
}

Ok。我得到了它。除了
hashCode()
之外,还需要实现
equals()
。这个问题与指定的DUP完全不同。这个问题说明了为什么
equals()
应该与
hashCode()
保持一致,但是这个问题是关于如何实现/使用
Map
,这样就映射而言,具有相同哈希代码的键被认为是等效的。他们是有联系的,但关系密切。