我有一个简单的对象,我想用作HashMap中的一个键。 MyObject的定义如下:
MyObject obj1 = new MyObject("some string");
MyObject obj2 = new MyObject("some string");
assertTrue(obj1.equals(obj2));
assertTrue(obj1.hashCode()==obj2.hashCode());
根据ConcurrentHashMap.get的文件,
如果此映射包含从键k到值v的映射,使得key.equals(k), 然后这个方法返回v;否则返回null
但是,如果我尝试使用MyObject作为地图密钥,则检索失败:
ConcurrentHashMap<MyObject,String> map = new ConcurrentHashMap<MyObject,String>();
map.put(obj1,"test value");
String foundValue = map.get(obj2);
assertNotNull(foundValue); //fails
我错过了什么?
编辑:根据要求,这是一个完整的示例:
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
public class MyObject {
String name = null;
public MyObject(String name) {
this.name = name;
}
public String getName() {
return name;
}
public boolean equals(MyObject otherObject) {
boolean result = false;
if (otherObject!=null) {
if (getClass().equals(otherObject.getClass())) {
if (name==null) {
if (otherObject.getName()==null)
result = true;
} else if (name.equals(otherObject.getName()))
result = true;
}
}
return result;
}
public int hashCode() {
return Objects.hash(name);
}
public static void main(String[] args) {
MyObject obj1 = new MyObject("some string");
MyObject obj2 = new MyObject("some string");
if (obj1.equals(obj2) && obj1.hashCode()==obj2.hashCode()) {
ConcurrentHashMap<MyObject,String> map = new ConcurrentHashMap<MyObject,String>();
map.put(obj1,"test value");
String foundValue = map.get(obj2);
if (foundValue==null)
System.out.println("get returned null");
else
System.out.println("get returned my string");
} else {
System.out.println("something's not equal");
}
}
}
答案 0 :(得分:3)
您没有覆盖equals
,而是创建了一个具有不同签名的新equals
方法。
如果你改变了
public boolean equals(MyObject otherObject) {
到
public boolean equals(Object otherObject) {
(并添加适当的演员表),您的代码将按预期工作。
您可以使用@Override
注释轻松避免该错误,这会导致编译错误。