嘿,我正在使用HashMap
在公告板上跟踪服务和服务请求。但是,我的哈希码和等于错误,因为我得到了重复的键。谁能告诉我为什么会这样吗?
keySet的内容:
Services: [1, 1, 6, 6, 3]
Requests: [8, 7, 6, 5, 8, 4, 5, 6, 2]
这是相关代码:
private static final HashMap<Advert, Integer> services = new HashMap<>();
...
public class Advert {
private int id;
private BoardPoster poster;
public Advert(BoardPoster poster) {
this.poster = poster;
}
public BoardPoster getPoster() {
return poster;
}
public void spawn() {
id = RANDOM.nextInt(ADVERT_RANGE);
}
public int getID() {
return id;
}
@Override
public String toString() {
return Integer.toString(id);
}
@Override
public boolean equals(Object o) {
if (o != null && o instanceof Advert) {
return ((Advert) o).id == id;
}
return false;
}
@Override
public int hashCode() {
return 67 * 5 + this.id;
}
}
最可能的原因是用作键的对象是可变的。所以如果你做类似的事情:
map.put(anAdvert, 1);
anAdvert.spawn(); //modifies id, which affects hashcode and equals
地图的行为将是意想不到的。
cf 地图的 javadoc
注意:如果使用可变对象作为映射键,则必须非常小心。如果对象的值以影响等于比较的方式更改,而该对象是映射中的键,则未指定映射的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)