为什么ConcurrentHashMap不返回值,即使key.equals(k)?

时间:2014-11-04 18:55:40

标签: java

我有一个简单的对象,我想用作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");
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您没有覆盖equals,而是创建了一个具有不同签名的新equals方法。

如果你改变了

public boolean equals(MyObject otherObject) {

public boolean equals(Object otherObject) {

(并添加适当的演员表),您的代码将按预期工作。

您可以使用@Override注释轻松避免该错误,这会导致编译错误。