Java 为什么';t ConcurrentHashMap返回值,即使key.equals(k)?

Java 为什么';t ConcurrentHashMap返回值,即使key.equals(k)?,java,Java,我有一个简单的对象,我想在HashMap中用作键。MyObject的定义如下: MyObject obj1 = new MyObject("some string"); MyObject obj2 = new MyObject("some string"); assertTrue(obj1.equals(obj2)); assertTrue(obj1.hashCode()==obj2.hashCode()); 根据该公司的文件 如果此映射包含从键k到值v的映射,使得键等于(k), 然后这个方法

我有一个简单的对象,我想在HashMap中用作键。MyObject的定义如下:

MyObject obj1 = new MyObject("some string");
MyObject obj2 = new MyObject("some string");
assertTrue(obj1.equals(obj2));
assertTrue(obj1.hashCode()==obj2.hashCode());
根据该公司的文件

如果此映射包含从键k到值v的映射,使得键等于(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
ConcurrentHashMap=新的ConcurrentHashMap();
map.put(obj1,“测试值”);
字符串foundValue=map.get(obj2);
assertNotNull(foundValue)//失败
我错过了什么


编辑:根据要求,下面是一个完整的运行示例:

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");
        }
    }
}
导入java.util.Objects;
导入java.util.concurrent.ConcurrentHashMap;
公共类MyObject{
字符串名称=null;
公共MyObject(字符串名称){
this.name=名称;
}
公共字符串getName(){
返回名称;
}
公共布尔等于(MyObject otherObject){
布尔结果=假;
如果(其他对象!=null){
if(getClass().equals(otherObject.getClass())){
if(name==null){
if(otherObject.getName()==null)
结果=真;
}else if(name.equals(otherObject.getName()))
结果=真;
}
}
返回结果;
}
公共int hashCode(){
返回Objects.hash(name);
}
公共静态void main(字符串[]args){
MyObject obj1=新的MyObject(“某些字符串”);
MyObject obj2=新的MyObject(“某些字符串”);
if(obj1.equals(obj2)&&obj1.hashCode()==obj2.hashCode()){
ConcurrentHashMap=新的ConcurrentHashMap();
map.put(obj1,“测试值”);
字符串foundValue=map.get(obj2);
if(foundValue==null)
System.out.println(“get returned null”);
其他的
System.out.println(“返回我的字符串”);
}否则{
System.out.println(“不相等的东西”);
}
}
}

您没有重写
equals
,而是创建了一个新的
equals
方法,该方法具有不同的签名

如果你改变

public boolean equals(MyObject otherObject) {

(并添加适当的强制转换),您的代码将按预期工作


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

您没有重写
equals
,而是使用不同的签名创建了一个新的
equals
方法

如果你改变

public boolean equals(MyObject otherObject) {

(并添加适当的强制转换),您的代码将按预期工作


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

您没有重写
equals
,而是使用不同的签名创建了一个新的
equals
方法

如果你改变

public boolean equals(MyObject otherObject) {

(并添加适当的强制转换),您的代码将按预期工作


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

您没有重写
equals
,而是使用不同的签名创建了一个新的
equals
方法

如果你改变

public boolean equals(MyObject otherObject) {

(并添加适当的强制转换),您的代码将按预期工作


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

您是否也使用了@markspace yes。我更新了问题以反映这一点。然后您必须显示
MyObject
中的代码。HashMap有效,问题一定在其他地方。向我们展示您创建的equals和hashCode方法。尝试将Objects.hash(name)替换为name.hashCode()。来自文档:警告:当提供单个对象引用时,返回值不等于该对象引用的哈希代码。这个值可以通过调用hashCode(Object)来计算。@cecil23如果我这样做,我需要检查null。hash()应该会处理这个问题。不管怎样,我改变了它,结果是一样的。你是否也@markspace是的。我更新了问题以反映这一点。然后您必须显示
MyObject
中的代码。HashMap有效,问题一定在其他地方。向我们展示您创建的equals和hashCode方法。尝试将Objects.hash(name)替换为name.hashCode()。来自文档:警告:当提供单个对象引用时,返回值不等于该对象引用的哈希代码。这个值可以通过调用hashCode(Object)来计算。@cecil23如果我这样做,我需要检查null。hash()应该会处理这个问题。不管怎样,我改变了它,结果是一样的。你是否也@markspace是的。我更新了问题以反映这一点。然后您必须显示
MyObject
中的代码。HashMap有效,问题一定在其他地方。向我们展示您创建的equals和hashCode方法。尝试将Objects.hash(name)替换为name.hashCode()。来自文档:警告:当提供单个对象引用时,返回值不等于该对象引用的哈希代码。这个值可以通过调用hashCode(Object)来计算。@cecil23如果我这样做,我需要检查null。hash()应该会处理这个问题。不管怎样,我改变了它,结果是一样的。你是否也@markspace是的。我更新了问题以反映这一点。然后您必须显示
MyObject
中的代码。HashMap有效,问题一定在其他地方。向我们展示您创建的equals和hashCode方法。尝试将Objects.hash(name)替换为name.hashCode()。来自文档:警告:当提供单个对象引用时,返回值不等于该对象引用的哈希代码