gpt4 book ai didi

java - HashMap 做 containsKey 的方式不符合预期

转载 作者:搜寻专家 更新时间:2023-11-01 01:42:08 24 4
gpt4 key购买 nike

今天,当我不得不使用 contains() 来查找一个类 Coord 是否在另一个 keySet() 中时,我正在做一些寻路工作> 坐标。我发现当我使用预制方法 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);

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

HashMap test for containsKey : false
My test for containsKey : true

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

此外,这是 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 通过散列码查找对象。契约的一部分是关键类必须覆盖 hashCode() 以及 equals()。不同对象的默认哈希码不相等,因此 get 找不到该对象。相比之下,当您遍历所有条目时,不会使用哈希码,因此只会调用 equals 并找到对象。

要使用 get 找到它,请覆盖 Coord 中的 hashCode

每当您覆盖equals 时,覆盖hashCode 总是好的,反之亦然。

关于java - HashMap 做 containsKey 的方式不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31169067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com