gpt4 book ai didi

Java HashMap containsKey 为现有对象返回 false

转载 作者:IT老高 更新时间:2023-10-28 21:06:14 26 4
gpt4 key购买 nike

我有一个用于存储对象的 HashMap:

    private Map<T, U> fields = Collections.synchronizedMap(new HashMap<T, U>());

但是,当尝试检查 key 是否存在时,containsKey 方法返回 false
实现了equalshashCode方法,但是没有找到key。
调试一段代码时:

    return fields.containsKey(bean) && fields.get(bean).isChecked();

我有:

   bean.hashCode() = 1979946475 
fields.keySet().iterator().next().hashCode() = 1979946475
bean.equals(fields.keySet().iterator().next())= true
fields.keySet().iterator().next().equals(bean) = true

但是

fields.containsKey(bean) = false

什么会导致这种奇怪的行为?

public class Address extends DtoImpl<Long, Long> implements Serializable{

<fields>
<getters and setters>

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + StringUtils.trimToEmpty(street).hashCode();
result = prime * result + StringUtils.trimToEmpty(town).hashCode();
result = prime * result + StringUtils.trimToEmpty(code).hashCode();
result = prime * result + ((country == null) ? 0 : country.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Address other = (Address) obj;
if (!StringUtils.trimToEmpty(street).equals(StringUtils.trimToEmpty(other.getStreet())))
return false;
if (!StringUtils.trimToEmpty(town).equals(StringUtils.trimToEmpty(other.getTown())))
return false;
if (!StringUtils.trimToEmpty(code).equals(StringUtils.trimToEmpty(other.getCode())))
return false;
if (country == null) {
if (other.country != null)
return false;
} else if (!country.equals(other.country))
return false;
return true;
}


}

最佳答案

key 插入 map 后不得修改。

编辑:我在 Map 中找到了 javadoc 的摘录。 :

Note: great care must be exercised if mutable objects are used as map keys. The behavior of a map is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the map.

一个简单的包装类的例子:

public static class MyWrapper {

private int i;

public MyWrapper(int i) {
this.i = i;
}

public void setI(int i) {
this.i = i;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
return i == ((MyWrapper) o).i;
}

@Override
public int hashCode() {
return i;
}
}

和测试:

public static void main(String[] args) throws Exception {
Map<MyWrapper, String> map = new HashMap<MyWrapper, String>();
MyWrapper wrapper = new MyWrapper(1);
map.put(wrapper, "hello");
System.out.println(map.containsKey(wrapper));
wrapper.setI(2);
System.out.println(map.containsKey(wrapper));
}

输出:

true
false

注意:如果你不覆盖 hashcode() 那么你只会得到 true

关于Java HashMap containsKey 为现有对象返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21600344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com