Java HashMap.containsKey()返回false。为什么?
这是我的密码:Java HashMap.containsKey()返回false。为什么?,java,hashmap,Java,Hashmap,这是我的密码: class Main{ static HashMap<Wrapper, Thing> map = new HashMap<Wrapper, Thing>(); public static void main(String[] args){ map.put(new Wrapper(1,2,3), new Thing(...)); System.out.println(map.containsKey(new W
class Main{
static HashMap<Wrapper, Thing> map = new HashMap<Wrapper, Thing>();
public static void main(String[] args){
map.put(new Wrapper(1,2,3), new Thing(...));
System.out.println(map.containsKey(new Wrapper(1, 2, 3)); // prints 'false'
}
private static class Wrapper{
int[] array;
public Wrapper(int... array){
this.array = array;
}
public boolean equals(Object object){
if(!(o instanceof Wrapper)) return false;
return Arrays.equals(this.intervals, ((Wrapper) o).intervals);
}
}
}
主类{
静态HashMap map=newhashmap();
公共静态void main(字符串[]args){
放置(新包装(1,2,3),新事物(…);
System.out.println(map.containsKey(新包装器(1,2,3));//打印'false'
}
私有静态类包装器{
int[]数组;
公共包装器(int…数组){
this.array=数组;
}
公共布尔等于(对象){
如果(!(o包装器实例))返回false;
返回数组.equals(this.interval,((Wrapper)o.interval);
}
}
}
为什么
map.containsKey(新包装(1,2,3)
返回false
?哈希代码必须匹配,除非覆盖hashCode(),否则默认情况下它是随机生成的
试一试
重写
.hashcode
。并确保ChordTemplate
也执行同样的操作。谢谢,我将尝试此操作。顺便说一句,我需要包装类的原因是它不能将普通数组用作映射键。例如map.containsKey(新int[]{1,2,3})
,其中一个相同的数组作为一个键存在于映射中,返回false。如果没有覆盖hashcode
的包装器,有没有办法实现这一点?@Prog您可以拥有一个带有自定义比较器的树映射。(不幸的是?)array.equals不做您认为它会做的事情,只是检查指针是否相等。有关更多信息,请参阅。我明白了。我将继续使用包装器。当您告诉哈希映射查找或获取元素时,它首先计算该对象的哈希代码,并检查映射中是否有具有相同哈希代码的对象。如果是,则我认为它会检查是否相等n如果有多个对象具有相同的哈希代码,则检查两个对象(它找到的对象和您给它的对象)。我不能100%确定相等部分,但它肯定会首先检查哈希代码。在您的情况下,它甚至没有在映射中找到具有相同哈希代码的对象。
public int hashCode() { return Arrays.hashCode(array); }