我有一个以下程序,我有一个hashmap。 hashmap的键是简单整数,值是整数数组。该计划如下:
Map<String , int []> myMap = new HashMap<String , int []>();
myMap.put("EvenNumbers", new int[]{2,4,6,8,10,12,14,16,18,20});
myMap.put("OddNumbers", new int[]{1,3,5,7,9,11,13,15,17,19});
myMap.put("DivisibleByThree", new int[]{3,6,9,12,15,18});
myMap.put("DivisibleByFive", new int[]{5,10,15,20});
int[] array = new int[]{1,3,5,7,9,11,13,15,17,19};
System.out.println(myMap.containsKey("EvenNumbers"));
System.out.println(myMap.containsKey("OddNumbers"));
//The following two lines produce a false output. Why ?
System.out.println(myMap.containsValue(new int[]{5,20,15,20} ));
System.out.println(myMap.containsValue(array));
而以下代码生成真值
HashMap newmap = new HashMap();
// populate hash map
newmap.put(1, "tutorials");
newmap.put(2, "point");
newmap.put(3, "is best");
// check existence of value 'point'
System.out.println("Check if value 'point' exists: " +
newmap.containsValue("point"));
为什么会这样?我哪里出错了?我失踪的是什么?在这两种情况下,我觉得我在做同样的事情。我是java环境的新手,因此很混乱。请帮我清除这些概念。
答案 0 :(得分:3)
查看equals vs Arrays.equals in Java
Map使用equals来确定,如果Map中存在值,但它意味着不同的东西:
答案 1 :(得分:2)
因为Map.containsValue()
正在根据值类型的.equals()
方法查找匹配项。 .equals()
的{{1}}方法有效地检查两个引用是否相同。
您可以将int[]
变量放在地图中,然后询问地图是否包含array
变量,以便自行检查。它应该返回true,因为它包含具有相同引用的array
。
它适用于&#34;点&#34;是因为int[]
返回true。
答案 2 :(得分:2)
这是因为boolean x = new int[]{ 5, 20, 15, 20 }.equals(new int[] { 5, 20, 15, 20 });
返回false。一种解决方案是使用java.nio.IntWrapper,试试这个
map.put("a1", IntBuffer.wrap(new int[]{ 5, 20, 15, 20 }));
boolean equals = map.containsValue(IntBuffer.wrap(new int[]{ 5, 20, 15, 20 }));