加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – HashMap只能通过hashCode()[复制]

发布时间:2020-12-15 04:35:03 所属栏目:Java 来源:网络整理
导读:参见英文答案 Why do I need to override the equals and hashCode methods in Java?????????????????????????????????????28个 我刚刚实现了HashMap K,V检查k.hashCode()= key.hashCode()和k == key. 因此,无论k是否与key“等价”,k必须是== to key. 是否可
参见英文答案 > Why do I need to override the equals and hashCode methods in Java?????????????????????????????????????28个
我刚刚实现了HashMap< K,V>检查k.hashCode()= key.hashCode()和k == key.

因此,无论k是否与key“等价”,k必须是== to key.

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

解决方法

So,it’s regardless whether k is “equivalent” to key,k must be == to key.

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

另一方面,不具有有意义意义的类型,其中不同的实例是等效的,不应该,并且通常不会覆盖equals()(或hashCode()).从Object继承的实现产生与==运算符相同的结果,这使得将这些对象用作HashMap键或将它们存储在HashSet中是可能的,也是合理的,至少在某些情况下是这样.

Is it possible to change this behaviour in order to use only hashCode() equivalence?

在这方面不可能改变HashMap的行为.如果您能够这样做,那么生成的地图将无法正确履行地图合同.但是,您可以实现自己的类似于地图的类,其行为与您描述的一样,或者您可以创建一个包装类以用作替代键类型.

示例关键类:

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()));
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读