我定义了一个简单的私有类SetOb,它包含一个int和一个Set数据结构。我在'main'方法中有一个HashMap,其中SetOb作为键,Integer作为值。现在,您可以在main方法中看到,当我用SetOb实例提供给HashMap,然后查找具有完全相同值的实例时,它将返回“ null”。在我使用自己定义的数据结构(例如SetOb作为HashMap中的Key)之前,这已经发生了好几次。有人可以指点我我想念的是什么吗?
请注意,在SetOb类的构造函数中,我复制了作为参数传递的Set。
public class Solution {
public static Solution sample = new Solution();
private class SetOb {
public int last;
public Set<Integer> st;
public SetOb(int l , Set<Integer> si ){
last = l;
st = new HashSet<Integer>(si);
}
}
public static void main(String[] args) {
Map<SetOb, Integer> m = new HashMap< SetOb, Integer>();
Set<Integer> a = new HashSet<Integer>();
for(int i =0; i<10; i++){
a.add(i);
}
SetOb x = sample.new SetOb(100, a);
SetOb y = sample.new SetOb(100, a);
m.put(x,500);
Integer val = m.get(y);
if(val!= null) System.out.println("Success: " + val);
else System.out.println("Failure");
}
}
最佳答案
您的x
和y
不是相同的对象实例,因此包含的对象无法将y
与x
匹配,最终导致在Map中找不到匹配的键/值。
如果您希望匹配成功,请在hasCode
中实现(重写)equals
和SetOb
方法,该方法将比较字段值。
示例方法(Eclipse生成)如下:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + last;
result = prime * result + ((st == null) ? 0 : st.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SetOb other = (SetOb) obj;
if (last != other.last)
return false;
if (st == null) {
if (other.st != null)
return false;
} else if (!st.equals(other.st))
return false;
return true;
}
关于java - Java中的HashMap无法哈希MyObject,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13225176/