一个HashMap目前,我有这段代码:怎样的hashCode工作在Java
Map<Site, LinkedList<Site.Hosts.Host>> map = new HashMap<Site, LinkedList<Site.Hosts.Host>>();
for (PerformanceCounter element : pc) {
Site s = new Site();
s.id = Short.parseShort(element.getSite_id());
s.name = element.getSite_name();
s.location = element.getSite_location();
Site.Hosts.Host h = new Site.Hosts.Host();
h.id = Short.parseShort(element.getHost_id());
if (!map.containsKey(s)) {
map.put(s, new LinkedList<Site.Hosts.Host>());
} else {
map.get(s).add(h);
}
}
,我读PerformanceCounters名单:
1, C-01, New York, 1001
1, C-01, New York, 1002
1, C-01, New York, 1003
其中101是id, C-01是这个名字,而纽约是这个位置。
不幸的是,我的代码为我的地图创建了3个键值。
我无法使用LinkedList
中的3个值生成1个密钥。
我的if(!map.containsKey(s))
部分工作不正常,我不知道如何解决这个问题。
HashMap使用hashCode()和equals()来定位和比较键。你忽略了他们吗?你能告诉我们他们的代码吗? –
我没有重写任何方法。我感到困惑的是,我的Site对象有4个字段:Short id,String name,String location和Hosts host。我故意留下“主机”为空,其余的值都是一样的。我不确定是否错误是因为我的比较在对象字段为空时失败。 – user1413969
如果你没有重写equals()和hashCode(),那么Site的2个实例,即使它们的所有字段是相等的,也会不同。阅读Object.equals()和Object.hashCode()的javadoc,确保理解他们做什么和他们的合同是什么,并覆盖它们。另外请注意,使用公共字段是不好的做法,并且使用可变类作为Map键是危险的。 –