HashMap的方法containsKey行为不符合预期 [英] HashMap way of doing containsKey not behaving as expected
问题描述
今天,当我不得不使用 contains()
查找类 Coord
时,我正在做一些寻路。在另一个 Coord
的 keySet()
中。
我发现,当我习惯使用预制方法 containsKey()
时,它根本无法按我的意愿工作。我进行了测试,以了解正在发生的情况,这里是:
Today I was doing some pathfinding when I had to use contains()
to find if a class Coord
was in an other keySet()
of Coord
.
I found that when I used to premade method containsKey()
, it was simply not working as I wanted. I made a test to find out what is happening and here it is:
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);
令人惊讶的是,这是我发现的:
And surprisingly, here is what I found :
HashMap test for containsKey : false
My test for containsKey : true
我只是想知道发生了什么以及为什么。
I just wanted to know what is happening and why.
此外,这是 Coord
class:
Also, here is the Coord
class :
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;
}
}
推荐答案
HashMap
通过哈希码查找对象。合同的一部分是,键类必须覆盖 hashCode()
和 equals()
。各个对象的默认哈希码不相等,因此 get
找不到该对象。相反,当您遍历所有条目时,不使用哈希码,因此仅调用 equals
并找到对象。
HashMap
s find objects by their hash code. Part of the contract is that the key class must override hashCode()
as well as equals()
. The default hash codes for separate objects aren't equal, so the object isn't found by get
. In contrast, when you loop over all entries, the hash code isn't used, so only equals
is called, and the object is found.
要使用 get
查找它,请覆盖 Coord中的
。 hashCode
To find it using get
, override hashCode
in Coord
.
每次重写<$ c $时,最好重写 hashCode
c>等于,反之亦然。
It is always good to override hashCode
whenever you override equals
, and vice versa.
这篇关于HashMap的方法containsKey行为不符合预期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!