HashMap<K,V>只使用hashCode()方法吗?

3
我刚意识到HashMap<K,V>检查k.hashCode() = key.hashCode()k == key
所以,无论,。
是否可能更改此行为以仅使用hashCode()等价性?

1
这个问题与被提名的重复问题完全不同。那个问题是关于为什么equals()应该与hashCode()一致,但这个问题是关于如何实现/使用一个Map,使得具有相同哈希码的键在地图的目的中被视为等效的。它们是相关的,但密切相关。 - John Bollinger
3个回答

4

1
好的,我明白了。除了实现hashCode()之外,还需要实现equals() - Jordi

2
因此,无论k是否与key“相等”,k都必须==key

不,那是不正确的,正如@KevinWallis已经观察到的那样。 HashMap使用hashCode()来识别正确的哈希桶,使用equals()而不是 == 比较落入同一存储桶中的键。具有区分不同实例之间等效意义的类型应通过其equals()方法描述该问题,并且标准库类型(例如StringInteger)实际上确实这样做。当键是这种类型时,您不必使用相同的对象从HashMap检索值,以便您将其存储。

另一方面,没有明显的方式使不同实例等效的类型不应重写equals()(或hashCode())。从Object继承的实现会产生与 == 运算符相同的结果,这使得在某些情况下可以合理地使用这些对象作为HashMap键或将它们存储在HashSet中。

因此,无论k是否与key“相等”,k都必须==key

不,那是不正确的,正如@KevinWallis已经观察到的那样。 HashMap使用hashCode()来识别正确的哈希桶,使用equals()而不是 == 比较落入同一存储桶中的键。具有区分不同实例之间等效意义的类型应通过其equals()方法描述该问题,并且标准库类型(例如StringInteger)实际上确实这样做。当键是这种类型时,您不必使用相同的对象从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()));
    }
}

1

是否可以更改此行为以仅使用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 ();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接