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
,这样就映射而言,具有相同哈希代码的键被认为是等效的。他们是有联系的,但关系密切。