我正在尝试使用hashmap实现一个稀疏的网格,但是似乎覆盖的hashcode()我的期望不大。我已经将问题归结为以下代码:
public class Main {
private static class Coord {
int x, y;
public Coord(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public int hashCode() {
// See https://en.wikipedia.org/wiki/Pairing_function#Cantor_pairing_function
return (((x + y) * (x + y + 1)) / 2) + y;
}
}
public static void main(String[] args) {
HashMap<Coord, String> grid = new HashMap<Coord, String>();
grid.put(new Coord(0, 0), "A");
System.out.println(grid.get(new Coord(0, 0)));
}
}
我希望输出为:
A
但是,输出为:
null
"新坐标(0,0)"实例都应返回相同的哈希码(),但似乎没有我的期望。为什么它不正如我所期望的?
a HashMap
不能单独使用hashCode
。它也依靠equals
。
解释原因,让我们考虑一个HashMap<String, ?>
。假设一个人具有无限内存,可以为此地图创建无限数量的键,但只有430万左右的哈希码(可能的int
s的数量)。因此,会有碰撞。这就是为什么需要equals
才能确保我们获得正确的密钥的值。