Java - HashMap不能将新对象用作搜索关键字

时间:2017-12-04 20:46:24

标签: java dictionary hashmap

我在这里要做的是使用密钥HashMap填充Obj对象Key,当我完成时,我想根据任何任何内容访问这些值可能的钥匙。我写了下面的代码,发生了什么,虽然第一个节目真的显示了我想要的值,但第二个节目提出了NullPointerException

import java.util.*;

public class My{
public static void main(String[] args){
    Map<Key,Obj> myMap = new HashMap<Key,Obj>();

    Obj ob1 = new Obj("Nick",19);
    Obj ob2 = new Obj("George",17);

    Key key1 = new Key(1,2);
    Key key2 = new Key(2,1);

    myMap.put(key1,ob1);
    myMap.put(key2,ob2);

    myMap.get(key1).show();
    myMap.get(new Key(1,2)).show();

}

我可以说Java不知道new Key(1,2)key1是否相等,但我想不出如何克服这个问题。

public class Obj{

    private String name;
    private int age;

    Obj(String name, int age){
        this.name = name;
        this.age = age;
    }

    public void show(){
         System.out.println(name + " " + age);
    }
}

这些是我使用的课程

import java.* ;

public class Key{

    public int x,y;

    Key(int x, int y){
        this.x = x;
        this.y = y;
    }

    public boolean equals(Key d){
        if ((this.x == d.x)&&(this.y == d.y)){
            return true;
        }
        else{
            return false;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您在实施Key时遇到两个问题。首先,equals'方法签名是错误的 - 它应该是public boolean equals(Object)。如果您使用了@Override注释,则此错误很容易引起注意。其次,您还应该覆盖hashCode()方法:

@Override
public boolean equals(Object o) {
    if (o == null || getClass() != o.getClass()) {
        return false;
    }
    Key key = (Key) o;
    return x == key.x && y == key.y;
}

@Override
public int hashCode() {
    return Objects.hash(x, y);
}