我正在使用此代码来检查数组是否存在于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
?
问题是因为两个int[]
不相等。
System.out.println(
(new int[] { 1, 2 }).equals(new int[] { 1, 2 })
); // prints "false"
Map
和其他 Java Collections Framework 类根据以下方式定义其接口equals
. From Map API http://java.sun.com/javase/6/docs/api/java/util/Map.html:
Collections Framework 接口中的许多方法都是根据equals
方法。例如,规范为containsKey(Object key)
方法说:“返回true
当且仅当此映射包含键的映射k
这样(key==null ? k==null : key.equals(k))
."
请注意,它们不必是同一个对象;它们可以是同一个对象。他们必须是equals
。 Java 中的数组扩展自Object
,其默认实现equals
仅在对象身份时返回 true;因此为什么它打印false
在上面的片段中。
您可以通过多种方式之一解决您的问题:
- Define your own wrapper class for arrays whose
equals
uses java.util.Arrays http://java.sun.com/javase/6/docs/api/java/util/Arrays.html equals/deepEquals
method.
- 并且不要忘记当你
@Override equals(Object)
,你还必须@Override hashCode
- 使用类似的东西
List<Integer>
that does define equals
就它们所包含的值而言
- 或者,如果你can使用参考相等
equals
, you can坚持你所拥有的。正如您不应该期望上面的代码片段会被打印一样true
,您不应该期望能够仅通过数组的值找到数组;每次都必须坚持并使用原始参考资料。
也可以看看:
- 在 Java 中重写 equals 和 hashCode https://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java
- 如何保证hashCode()和equals()一致? https://stackoverflow.com/questions/410236/how-to-ensure-hashcode-is-consistent-with-equals
- 了解 HashMap 中 equals 和 hashCode 的工作原理 https://stackoverflow.com/questions/1894377/understanding-the-workings-of-equals-and-hashcode-in-a-hashmap
API
-
Object.equals http://java.sun.com/javase/6/docs/api/java/lang/Object.html#equals%28java.lang.Object%29 and Object.hashCode http://java.sun.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29
- 对于 Java 程序员来说,了解这些契约以及如何使它们与系统的其余部分一起工作非常重要
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)