[英]HashMap implementation that allows to override hash and equals method
[英]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.