一尘不染

具有Int数组的Java HashMap

java

我正在使用此代码来检查数组是否存在HashMap

public class Test {
    public static void main(String[] arg) {
        HashMap<int[], String> map = new HashMap<int[], String>();
        map.put(new int[]{1, 2}, "sun");
        System.out.println(map.containsKey((new int[]{1, 2})));
    }
}

但这印出来False。如何检查数组中是否存在HashMap


阅读 228

收藏
2020-12-03

共1个答案

一尘不染

问题是因为两者int[]不相等。

System.out.println(
    (new int[] { 1, 2 }).equals(new int[] { 1, 2 })
); // prints "false"

Map和其他Java Collections Framework类根据定义了其接口equals。来自Map API

Collections Framework接口中的许多方法都是根据equals方法定义的。例如,该containsKey(Object key)方法的规范说:“ true当且仅当此映射包含k诸如这样的键的映射时,才返回(key==null ? k==null : key.equals(k))。”

注意,它们不必是同一对象。他们一定是equals。Java中的数组从扩展Object,其默认实现的equalsreturn仅在对象标识上才返回true;因此,为什么要false在上面的代码段中进行打印。


您可以通过多种方式之一解决问题:

  • equals使用using 方法的数组定义自己的包装器类。 java.util.Arrays equals/deepEquals
    • 并且不要忘记,当您时@Override equals(Object),您还必须@Override hashCode
  • 使用类似List<Integer>的是 没有 定义equals在它们所包含的价值观方面
  • 或者,如果您 可以 使用的引用相等equals,则 可以 坚持使用现有的东西。就像您不希望上面的代码片段一起打印一样true,您也不应该仅凭其值就可以找到数组。您必须每次都坚持使用并使用原始参考。

API

  • Object.equalsObject.hashCode
    • 对于Java程序员来说,了解这些合同以及如何使其与系统的其余部分一起使用非常重要。
2020-12-03