Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashMap.containsKey()返回false。为什么?_Java_Hashmap - Fatal编程技术网

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); }