我在这里要做的是使用密钥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;
}
}
}
答案 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);
}