【发布时间】:2012-08-24 07:31:13
【问题描述】:
所以,我正在尝试使用 HashMap 将我自己的 Object 映射到 String 值。我的对象在下面(为简洁起见,删除了一些代码)
public class RouteHeadsignPair {
String route;
String headsign;
public RouteHeadsignPair(String n_route, String n_headsign) {
route = n_route.toLowerCase();
headsign = n_headsign.toLowerCase();
}
public String getRoute () {
return route;
}
public String getHeadsign() {
return headsign;
}
public boolean equals(RouteHeadsignPair other) {
return(other.getRoute().equals(route) && other.getHeadsign().equals(headsign));
}
public int hashCode() {
return(route.hashCode());
}
}
我通过从文本文件加载数据将这些对象映射到字符串。稍后,基于(独立)用户输入,我尝试使用RouteHeadsignPair 对象查询HashMap。 containsKey() 返回 false 而 get() 返回 null,就好像我从未将键添加到映射中一样。但是,奇怪的是,如果我使用以下代码迭代地图(其中newKey 是由用户输入生成的RouteHeadsignPair)
RouteHeadsignPair foundKey = null;
Iterator<RouteHeadsignPair> keysInMap = routeHeadsignToStopIdMap.keySet().iterator();
while(keysInMap.hasNext()) {
RouteHeadsignPair currKey = keysInMap.next();
if(currKey.equals(newKey)) {
System.err.println("Did find a key with an equals() == true!");
foundKey = currKey;
}
}
System.err.println("Value in map? " + routeHeadsignToStopIdMap.containsKey(newKey) + "( hashcode = " + newKey.hashCode() +
", equals = " + newKey.equals(foundKey) + ")");
System.err.println("foundKey in map? " + routeHeadsignToStopIdMap.containsKey(foundKey) + "( hashcode = " + foundKey.hashCode() +
", equals = " + foundKey.equals(newKey) + ")" );
我为代码格式道歉,太晚了,我开始胡思乱想了
我得到以下输出
Did find a key with an equals() == true!
然后
Value in map? false( hashcode = 1695, equals = true)
foundKey in map? true( hashcode = 1695, equals = true)
因此,如果我遍历键并查找返回 equals() 的键,我确实找到了一个,并且 hashCode() 对于这两个键都是相同的。如果hashCode() 与newKey 和foundKey 相同,并且foundKey.equals(newKey) 返回true,那么HashMap.get(key) 不应该返回一个值而containsKey() 返回true 吗?我在这里做错了什么?
【问题讨论】: