簡體   English   中英

如果 hashCode() & equals() 返回相同的值,用戶定義的 class 如何成為 hashmap 的鍵

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

我正在嘗試使用 UserDefined class 作為鍵來實現 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;
    }
    
}

output:-

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

誰能讓我知道它是如何工作的原因

發生這種情況是因為equals返回 false。 equals / hashCode合約完全被破壞了。 沒有斷言如果兩個對象相同,它們就相等。 兩個對象可以具有相同的哈希碼,但仍然不相等。

發生的情況是,在第 2 次和第 3 次 put 調用中,檢查給定存儲桶中的任何對象(由hashCode定義)是否相同。 它們不是因為equals返回false ,所以新的 object 被添加到同一個桶中。

您需要正確執行合同才能使其正常工作。

關於 equals/hashcode 合約的 Baeldung 教程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM