如果 hashCode() 和 equals() return 相同的值,UserDefined class 如何成为 hashmap 的键

How can UserDefined class be a key of hashmap if hashCode() & equals() return same value

我正在尝试使用 UserDefined class 作为 Key 来实现 HashMap,即使我实现了 hashCode()(returns 每个对象都为 0)和 equals()(returns 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

任何人都可以告诉我它是如何工作的原因

发生这种情况是因为 equals 返回 false。 equals/hashCode 契约完全被打破。没有断言如果两个对象相同,则它们是相等的。两个对象可以具有相同的哈希码,但仍然不相等。

发生的是在第二次和第三次 put 调用中,检查给定桶(由 hashCode 定义)中的任何对象是否相同。他们不是因为equalsreturnsfalse,所以新对象被添加到同一个桶中。

您需要正确执行合约才能正常工作。

Baeldung tutorial on equals/hashcode contract.