Java 为什么';t ConcurrentHashMap返回值,即使key.equals(k)?
我有一个简单的对象,我想在HashMap中用作键。MyObject的定义如下: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), 然后这个方法
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()。来自文档:警告:当提供单个对象引用时,返回值不等于该对象引用的哈希代码