假设我有一个HashMap:
HashMap<MyKey, Integer> HM = new HashMap<MyKey, Integer>();
MyKey对应于具有两个整数元素的数据对象(以及用于传递两个整数的构造函数)。
HM.put(new MyKey(1,1234), 1); // this seems to work...
但是,我似乎不能使用它:
System.out.println(HM.containsKey(new MyKey(1,1234)));
I get false.
HashMap可以有一个键的自定义数据对象吗?我错过了什么?谢谢…
您应该在MyKey类(或任何其他将进入HashMap或Set的自定义类)中重写equals()
和hashcode()
方法。这样,当您说containsKey()
(或Set方法contains()
或equals()
)时,您将显式指定MyKey的哪些属性要检查是否包含或相等。
你可以有一个简单的equals()
和hashCode()
方法像这样在你的MyKey类
@Override
public boolean equals(Object o) {
boolean result = false;
if (o instanceof MyKey) {
MyKey mykey = (MyKey) o;
result = (this.getX() == mykey.getX() && mykey.getY() == mykey.getY());
}
return result;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + X;
result = prime * result + Y;
return result;
}
(假设MyKey类中的字段是X和Y)
在您的系统中。输出时,生成的是new MyKey()
。您需要检查hashmap是否包含MyKey(1,1234)
,而不是new MyKey(1,1234)
。