HashMap做的containsKey行为方式不符合预期

Pâr*_*ady 4 java contains hashmap

这是一个关于java的简单问题.

今天,我在做一些寻路时,我不得不使用contains()发现如果一个类Coord是在其他keySet()Coord.我发现,当我习​​惯于预制方法时containsKey(),根本就没有按照我想要的方式工作.我做了一个测试,以了解发生了什么,这里是:

HashMap<Coord, Coord> test = new HashMap<Coord, Coord>();
test.put(new Coord(3, 3), new Coord(0, 0));

System.out.println("HashMap test for containsKey : " + test.containsKey(new Coord(3, 3)));

boolean containsKey = false;
for(Coord a : test.keySet())
{
    if(a.equals(new Coord(3, 3)))
    {
        containsKey = true;
    }
}

System.out.println("My test for containsKey : "+containsKey);
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,这是我发现的:

HashMap test for containsKey : false
My test for containsKey : true
Run Code Online (Sandbox Code Playgroud)

我只是想知道发生了什么以及为什么.

另外,这是Coord班级:

public class Coord
{
    public float x, y;

    public Coord(float a, float b)
    {
        this.x = a;
        this.y = b;
    }

    @Override
    public boolean equals(Object b)
    {
        if(b instanceof Coord)
        {
            Coord casted = (Coord) b;
            return casted.x == x && casted.y == y;
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

rge*_*man 7

HashMap通过哈希码查找对象.合同的一部分是密钥类必须覆盖hashCode()以及equals().单独对象的默认哈希码不相等,因此找不到该对象get.相反,当您遍历所有条目时,不使用哈希代码,因此仅equals调用该哈希代码,并找到该对象.

要使用发现get,覆盖hashCodeCoord.

hashCode无论何时覆盖都是好的equals,反之亦然.