我正在使用此代码来检查数组是否存在HashMap:
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?
False
问题是因为两者int[]不相等。
int[]
System.out.println( (new int[] { 1, 2 }).equals(new int[] { 1, 2 }) ); // prints "false"
Map和其他Java Collections Framework类根据定义了其接口equals。来自Map API:
Map
equals
Map API
Collections Framework接口中的许多方法都是根据equals方法定义的。例如,该containsKey(Object key)方法的规范说:“ true当且仅当此映射包含k诸如这样的键的映射时,才返回(key==null ? k==null : key.equals(k))。”
containsKey(Object key)
true
k
(key==null ? k==null : key.equals(k))
注意,它们不必是同一对象。他们一定是equals。Java中的数组从扩展Object,其默认实现的equalsreturn仅在对象标识上才返回true;因此,为什么要false在上面的代码段中进行打印。
Object
false
您可以通过多种方式之一解决问题:
java.util.Arrays
equals/deepEquals
@Override equals(Object)
@Override hashCode
List<Integer>
Object.equals
Object.hashCode