![](/img/trans.png)
[英]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.