簡體   English   中英

重寫equals方法以在插入HashMap時返回false

[英]Override equals method to return false while inserting to HashMap

import java.util.HashMap;
import java.util.Map;

public class MapTest {
    public String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    @Override
    public int hashCode(){
        return 100;
    }
    @Override
    public boolean equals(Object te){
        return false;
    }
    public static void main(String[] args) {
        MapTest obj = new MapTest();
        MapTest obj1 = new MapTest();
        obj.setId("test");
        obj1.setId("test2");
        Map<MapTest,Integer> test = new HashMap<MapTest,Integer>(); 
        test.put(obj, 1000);
        test.put(obj1, 2000);
        test.put(new MapTest(), 4000);
        System.out.println(test.get(obj)); //1000
        System.out.println(test.get(obj1));//2000
        System.out.println(test.get(new MapTest()));//Null
        System.out.println(test.size());//3
    }

}

這里的對象返回相同的哈希碼,因此為了避免在將數據添加到HashMap時被覆蓋,我有一個equals方法返回false。 現在,當我使用get時,我得到了正確的數據示例obj1和obj提供了確切的值,但是我的問題是,當它們的哈希碼相同時,java如何區分不同的對象並從hashmap返回它們的確切值。

答案在於HashMap如何實現get方法。 當它對照映射中存儲的鍵檢查給定鍵的相等性(當它們具有相等的哈希碼值時)時,它首先進行引用相等性檢查。 下面的代碼取自Java 8的get實現,如您所見, ==檢查密鑰。

if (e.hash == hash &&
   ((k = e.key) == key || (key != null && key.equals(k))))
      return e;

如果您使用另一個具有相同ID值的對象,則該對象將無法工作,因為在您的對象中沒有定義結構相等性。 嘗試這個:

TestMap obj2 = new TestMap();
obj2.setId("test");
System.out.println(test.get(obj2)); // Returns Null

哈希碼等於等於是哈希圖決定兩個鍵是否相同的首要要求,但不是唯一的/

(key1 == key2 || key1.equals(key2))也需要。

如果將equals方法更改為始終返回true,則可以看到地圖中最后只有一個元素。

暫無
暫無

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

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