首页 > 解决方案 > HashMap 有 integer[] 类型的键,虽然它的 containsKey 方法返回 false?

问题描述

在hackerrank上解决问题时,我发现由于逻辑错误,我的输出与正确答案不同。我重新创建了逻辑错误以更好地解释这种情况。

HashMap<Integer[] , Integer> hm = new HashMap<>();

//both a and b have different hashcode
Integer[] a = {1, 1, 0, 0};
Integer[] b = {1, 1, 0, 0}; 

hm.put(a,1);

if (!hm.containsKey(b)) {
    //key does not exists so, create new one  
    hm.put(b, 1);
}
else {
    //key does exists so, put its value = value + 1
    hm.put(b, hm.get(b)+1); 
}

这里 hm.containsKey(b) 返回 false 但如果它返回 true 我的输出将匹配正确的输出。由于 a 和 b 的内容相等,如何使 containsKey(b) 返回 true?

标签: javahashmaphashcode

解决方案


您不应该将数组用作 a 的键HashMap,因为数组不会覆盖equalsand hashCode,因此包含完全相同元素的不同数组实例不会被HashMap.

改用List<Integer>钥匙。

Map<List<Integer>, Integer> hm = new HashMap<>();

List<Integer> a = List.of(1, 1, 0, 0);
List<Integer> b = List.of(1, 1, 0, 0);

hm.put(a,1);

if (!hm.containsKey(b)) {
    //key does not exists so, create new one  
    hm.put(b, 1);
}
else {
    //key does exists so, put its value = value + 1
    hm.put(b, hm.get(b)+1); 
}

推荐阅读