問題描述
今天我正在做一些尋路,當我不得不使用 contains()
來查找一個類 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
類:
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
s 通過哈希碼查找對象.合同的一部分是密鑰類必須覆蓋 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
.
無論何時重寫 equals
,重寫 hashCode
總是好的,反之亦然.
It is always good to override hashCode
whenever you override equals
, and vice versa.
這篇關于HashMap 的 containsKey 方式未按預期運行的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!