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)
HashMap通过哈希码查找对象.合同的一部分是密钥类必须覆盖hashCode()以及equals().单独对象的默认哈希码不相等,因此找不到该对象get.相反,当您遍历所有条目时,不使用哈希代码,因此仅equals调用该哈希代码,并找到该对象.
要使用发现get,覆盖hashCode在Coord.
hashCode无论何时覆盖都是好的equals,反之亦然.
| 归档时间: |
|
| 查看次数: |
299 次 |
| 最近记录: |