Java HashMap和我自己滚动的关键对象的问题

Java HashMap和我自己滚动的关键对象的问题,java,hashmap,Java,Hashmap,因此,我尝试使用HashMap将我自己的对象映射到字符串值。下面是我的对象(为了简洁起见删除了一些代码) 我通过从文本文件加载数据将这些对象映射到字符串。稍后,基于(独立的)用户输入,我尝试使用RouteHeadsignPair对象查询HashMap。containsKey()返回false,get()返回null,就好像我从未将密钥添加到映射中一样。但是,奇怪的是,如果我使用下面的代码在地图上迭代(其中newKey是一个RouteHeadsignPair,由用户输入) 然后 Value in

因此,我尝试使用
HashMap
将我自己的
对象
映射到
字符串
值。下面是我的对象(为了简洁起见删除了一些代码)

我通过从文本文件加载数据将这些对象映射到字符串。稍后,基于(独立的)用户输入,我尝试使用
RouteHeadsignPair
对象查询
HashMap
。containsKey()返回false,get()返回null,就好像我从未将密钥添加到映射中一样。但是,奇怪的是,如果我使用下面的代码在地图上迭代(其中
newKey
是一个
RouteHeadsignPair
,由用户输入)

然后

Value in map? false( hashcode = 1695, equals = true)
foundKey in map? true( hashcode = 1695, equals = true)

因此,如果我迭代这些键并查找返回
equals()
的键,我确实找到了一个,并且
hashCode()
对于这两个键都是相同的。如果
hashCode()
对于
newKey
foundKey
foundKey.equals(newKey)
来说是相同的,那么
HashMap.get(key)
不应该返回值并且
containsKey()
返回真值吗?我在这里做错了什么?

您没有重写
对象。equals
-由于参数类型,您正在重载它。诊断代码调用过载,但map代码不调用(因为它不知道)

您需要一个签名为的方法

public boolean equals(Object other)
如果使用
@Override
注释,如果无法正确重写某些内容,则会出现错误

您需要首先检查
other
是否是
RouteHeadSignPair
的实例,然后进行强制转换。如果将
RouteHeadSignPair
类设置为final,则无需担心它是否是完全相同的类,等等


请注意,顺便说一句,您的哈希代码将发生不必要的冲突-如果您同时使用
路由
头签名
哈希来生成哈希代码,它可能会帮助您更高效地查找地图。(如果有多个实例具有相同的路线但不同的头部标志,如果地图在查找密钥时不必检查所有这些标志是否相等,这将非常有用。)

我还建议他添加空检查或反向相等()calls@EugenMartynov当前位置我不确定你所说的“反向等于调用”是什么意思,但是的,还有很多事情要做。将编辑。是的,我使用(route.hashCode()^headsign.hashCode())作为我的hashCode()结果,但在调试时对其进行了简化。无论如何,每条路线最多只能有两个头号,所以这没什么大不了的。@JonSkeet
instanceof
将处理空案例。很好的回答
Did find a key with an equals() == true!
Value in map? false( hashcode = 1695, equals = true)
foundKey in map? true( hashcode = 1695, equals = true)
public boolean equals(Object other)