问题是因为两者
int[]不相等。
System.out.println( (new int[] { 1, 2 }).equals(new int[] { 1, 2 })); // prints "false"Map和其他Java Collections framework类根据定义了其接口
equals。来自
MapAPI:
Collections framework接口中的许多方法都是根据
equals方法定义的。例如,该containsKey(Objectkey)方法的规范说:“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.equals
和Object.hashCode
- 对于Java程序员来说,了解这些合同以及如何使其与系统的其余部分一起使用非常重要。



