【问题标题】:Java hashCode doesn't work with HashMap?Java hashCode 不适用于 HashMap?
【发布时间】:2017-11-24 22:34:55
【问题描述】:

我正在尝试使用 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)”实例都应该返回相同的 hashCode(),但它似乎没有按我的预期工作。为什么它没有按我的预期工作?

【问题讨论】:

  • 你还需要覆盖equals
  • HashMap 需要 hashCodeequals 来做你想做的事情。

标签: java hashmap grid sparse-matrix hashcode


【解决方案1】:

HashMap 不能单独在 hashCode 上工作。它也依赖于equals

为了解释原因,让我们考虑一个HashMap&lt;String, ?&gt;。假设一个人有无限的内存,可以为这个映射创建无限数量的键,但只有 430 万左右可能的哈希码(可能的数量ints)。因此,会有碰撞。这就是为什么需要equals 以确保我们获得正确键的值的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    相关资源
    最近更新 更多