自定义类不能用作HashMap键

Emi*_*mil 1 java hashmap

我有以下代码:

import java.util.*;

class A {
    int x;

    A() { x = 0; }
    A(int t) { x = t; }

    public int hashCode() { return x; }
    public boolean equals(A that) { return x == that.x; }
}

class Test {

    static HashMap<A, Integer> stuff;

    public static void main(String[] args) {
        stuff = new HashMap<A,Integer>();
        A a = new A(1);
        stuff.put(a, 100);
        System.out.println(stuff.get(a).toString());
        System.out.println(stuff.get(new A(1)).toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么第二个印刷声明给我一个NullPointerException

awk*_*ksp 16

你不是压倒一切equals().正确的签名是

public boolean equals(Object o)
                      ^^^^^^
Run Code Online (Sandbox Code Playgroud)

请注意,类型是Object,而不是A.你做的是超载equals().

  • 始终使用`@Override`注释来避免这些情况; 你会被警告过的. (4认同)
  • @ user3217013没问题!只是小费; 如果您可以配置IDE来执行此操作,请确保(最好自动)在您认为应该覆盖的方法上放置一个`@Overrides`注释.要么你得到一个错误,你并没有真正覆盖某些东西(比如在这种情况下),或者你会得到一个警告,你要覆盖没有注释的东西(对于意外覆盖很有用) (2认同)