Java HashMap containsKey始终为false

Den*_*nis 2 java contains hashmap

我有一个有趣的情况,我存储了Coordinate一个HashMap<Coordinate, GUIGameField>.

现在,关于它的奇怪之处在于,我有一段代码,应该保护,不应该使用两次坐标.但是,如果我调试此代码:

if (mapForLevel.containsKey(coord)) {
    throw new IllegalStateException("This coordinate is already used!");
} else {
    ...do stuff...
}
Run Code Online (Sandbox Code Playgroud)

... containsKey总是返回false,虽然我将一个哈希码为9731的坐标存储到地图中,当前的坐标也有哈希码9731.

之后,mapForLevel.entrySet()看起来像:

(java.util.HashMap$EntrySet) [(270,90)=gui.GUIGameField@29e357, (270,90)=gui.GUIGameField@ca470]
Run Code Online (Sandbox Code Playgroud)

我可能做错了什么?我没有想法了.谢谢你的帮助!

public class Coordinate {
    int xCoord;
    int yCoord;

    public Coordinate(int x, int y) {
        ...store params in attributes...
    }

    ...getters & setters...

    @Override
    public int hashCode() {
        int hash = 1;
        hash = hash * 41 + this.xCoord;
        hash = hash * 31 + this.yCoord;
        return hash;
    }
}
Run Code Online (Sandbox Code Playgroud)

kos*_*tja 5

您应该覆盖equals,以hashCode使其正常工作.

编辑:我错误地说你应该使用hashCodeequals- 这是不正确的.虽然hashCode必须为两个相等的对象返回相同的结果,但它仍然可以为不同的对象返回相同的结果.