HashMap<K,V>
检查k.hashCode() = key.hashCode()
和k == key
。所以,无论,。
是否可能更改此行为以仅使用
hashCode()
等价性?HashMap<K,V>
检查k.hashCode() = key.hashCode()
和k == key
。hashCode()
等价性?hashCode
不会为您进行分组(将元素放入桶中),在桶中使用equals
进行比较。
请查看以下链接:Java HashMap如何处理具有相同哈希码的不同对象?
hashCode()
之外,还需要实现equals()
。 - Jordik
是否与key
“相等”,k
都必须==
于key
。
不,那是不正确的,正如@KevinWallis已经观察到的那样。 HashMap
使用hashCode()
来识别正确的哈希桶,使用equals()
而不是 ==
比较落入同一存储桶中的键。具有区分不同实例之间等效意义的类型应通过其equals()
方法描述该问题,并且标准库类型(例如String
和Integer
)实际上确实这样做。当键是这种类型时,您不必使用相同的对象从HashMap
检索值,以便您将其存储。
另一方面,没有明显的方式使不同实例等效的类型不应重写equals()
(或hashCode()
)。从Object
继承的实现会产生与 ==
运算符相同的结果,这使得在某些情况下可以合理地使用这些对象作为HashMap
键或将它们存储在HashSet
中。
k
是否与key
“相等”,k
都必须==
于key
。
不,那是不正确的,正如@KevinWallis已经观察到的那样。 HashMap
使用hashCode()
来识别正确的哈希桶,使用equals()
而不是 ==
比较落入同一存储桶中的键。具有区分不同实例之间等效意义的类型应通过其equals()
方法描述该问题,并且标准库类型(例如String
和Integer
)实际上确实这样做。当键是这种类型时,您不必使用相同的对象从HashMap
检索值,以便您将其存储。
另一方面,没有明显的方式使不同实例等效的类型不应重写equals()
(或hashCode()
)。从Object
继承的实现会产生与 ==
运算符相同的结果,这使得在某些情况下可以合理地使用这些对象作为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()));
}
}
是否可以更改此行为以仅使用hashCode()等效性?
是的,您可以重写equals方法,当两个比较的对象具有相同的hashCode()时返回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 ();
}
}
equals()
应该与hashCode()
一致,但这个问题是关于如何实现/使用一个Map
,使得具有相同哈希码的键在地图的目的中被视为等效的。它们是相关的,但密切相关。 - John Bollinger