Java hashCode 不适用于 HashMap?
Java hashCode doesn't work with HashMap?
我正在尝试使用 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
两个 "new Coord(0, 0)" 实例都应该 return 相同的 hashCode(),但它似乎并不像我预期的那样工作。为什么它没有像我预期的那样工作?
A HashMap
不能单独在 hashCode
上工作。它也依赖于 equals
。
为了解释原因,让我们考虑一个 HashMap<String, ?>
。假设一秒钟有无限内存,可以为这张地图创建无限数量的键,但只有 430 万左右可能的哈希码(可能的 int
数量)。因此,会发生碰撞。这就是为什么需要 equals
以确保我们获得正确键值的原因。
我正在尝试使用 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
两个 "new Coord(0, 0)" 实例都应该 return 相同的 hashCode(),但它似乎并不像我预期的那样工作。为什么它没有像我预期的那样工作?
A HashMap
不能单独在 hashCode
上工作。它也依赖于 equals
。
为了解释原因,让我们考虑一个 HashMap<String, ?>
。假设一秒钟有无限内存,可以为这张地图创建无限数量的键,但只有 430 万左右可能的哈希码(可能的 int
数量)。因此,会发生碰撞。这就是为什么需要 equals
以确保我们获得正确键值的原因。