Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义类不能用作HashMap键_Java_Hashmap - Fatal编程技术网

Java 自定义类不能用作HashMap键

Java 自定义类不能用作HashMap键,java,hashmap,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> stu

我有以下代码:

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());
    }
}
import java.util.*;
甲级{
int x;
A(){x=0;}
A(int t){x=t;}
public int hashCode(){return x;}
公共布尔等于(A that){return x==that.x;}
}
课堂测试{
静态哈希映射;
公共静态void main(字符串[]args){
stuff=newhashmap();
A=新的A(1);
东西。放(a,100);
System.out.println(stuff.get(a.toString());
System.out.println(stuff.get(新的A(1)).toString());
}
}

为什么第二个print语句给了我一个
NullPointerException

您没有重写
equals()
。正确的签名是

public boolean equals(Object o)
                      ^^^^^^

请注意,类型是
对象
,而不是
A
。您所做的是重载
equals()

您没有重写
equals()
。正确的签名是

public boolean equals(Object o)
                      ^^^^^^

请注意,类型是
对象
,而不是
A
。您所做的是重载
equals()

始终使用
@Override
注释来避免这些情况;你会被警告的。@user3217013没问题!只是一个提示;如果您可以将IDE配置为这样做,请确保(最好是自动地)在您认为应该覆盖的方法上添加一个
@Overrides
注释。要么你得到一个错误,说明你没有真正重写某些内容(如本例),要么你会得到一个警告,说明你在没有注释的情况下重写了某些内容(对于意外重写很有用)@user3217013不,就是这样。如果内存可用,则注释仅在编译时存在,并在生成字节码时被删除。@user3217013您没有。执行
instanceof
检查,如果返回
true
,则强制转换为所需类型。或者执行
检查if(o.getClass()==a.class)
,然后强制转换。如果使用<代码>实例> ,您可能需要考虑使<代码>等于方法>代码>最终< /代码>,使得它不能以与平等合同的自反部分不一致的方式在子类中被重写。始终使用<代码> @覆盖> <代码>注释来避免这些情况;你会被警告的。@user3217013没问题!只是一个提示;如果您可以将IDE配置为这样做,请确保(最好是自动地)在您认为应该覆盖的方法上添加一个
@Overrides
注释。要么你得到一个错误,说明你没有真正重写某些内容(如本例),要么你会得到一个警告,说明你在没有注释的情况下重写了某些内容(对于意外重写很有用)@user3217013不,就是这样。如果内存可用,则注释仅在编译时存在,并在生成字节码时被删除。@user3217013您没有。执行
instanceof
检查,如果返回
true
,则强制转换为所需类型。或者执行
检查if(o.getClass()==a.class)
,然后强制转换。如果使用<代码>实例> ,您可能需要考虑使<代码>等于方法>代码>最终< /代码>,这样它就不能在一个子类中被重写,这种方式与平等合同的自反部分不一致。