【问题标题】:How can UserDefined class be a key of hashmap if hashCode() & equals() return same value如果 hashCode() & equals() 返回相同的值,UserDefined 类如何成为 hashmap 的键
【发布时间】:2021-07-24 02:25:17
【问题描述】:

我正在尝试使用 UserDefined 类作为键来实现 HashMap,即使我同时实现了 hashCode()(每个对象返回 0)和 equals()(每个对象返回 false),我也成功了。我的代码

public class UserDefinedMapKey {

    public static void main(String[] args) {
        HashMap<Beck, Integer> hm = new HashMap<Beck, Integer>();
        hm.put(new Beck(10,"archit"), 20);
        hm.put(new Beck(10,"archit"), 30);
        hm.put(new Beck(30,"goel"), 50);
        
        for(Map.Entry<Beck, Integer> m : hm.entrySet()) {
            System.out.println(m.getKey() + "===" + m.getValue());
        }
    }
    
}`
`

class Beck {
    int arc;
    String grc;
    
    public Beck(int i, String string) {
        // TODO Auto-generated constructor stub
    }
    public int getArc() {
        return arc;
    }
    public void setArc(int arc) {
        this.arc = arc;
    }
    public String getGrc() {
        return grc;
    }
    public void setGrc(String grc) {
        this.grc = grc;
    }
    
    @Override
    public int hashCode() {
        return 0;
    }
    
    @Override
    public boolean equals(Object b) {
        return false;
    }
    
}

输出:-

main.java.Interview.Beck@0===20
main.java.Interview.Beck@0===30
main.java.Interview.Beck@0===50

谁能告诉我它是如何工作的原因

【问题讨论】:

    标签: java hashmap equals hashcode user-defined-types


    【解决方案1】:

    这是因为equals 返回错误。 equals/hashCode 合约完全失效。没有断言如果两个对象相同,它们就相等。两个对象可以有相同的哈希码,但仍然不相等。

    发生的情况是,在第 2 次和第 3 次 put 调用中,会检查给定存储桶(由 hashCode 定义)中的任何对象是否相同。它们不是因为equals返回false,所以新对象被添加到同一个桶中。

    您需要正确执行合同才能使其正常工作。

    Baeldung tutorial on equals/hashcode contract.

    【讨论】:

    • 谢谢!!我正在尝试一些在面试中被问到的东西,当时我不确定,但现在我的疑问很清楚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多