关于Map.containsValue方法的困惑

时间:2014-05-13 04:39:37

标签: java hashmap

我有一个以下程序,我有一个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环境的新手,因此很混乱。请帮我清除这些概念。

3 个答案:

答案 0 :(得分:3)

查看equals vs Arrays.equals in Java

Map使用equals来确定,如果Map中存在值,但它意味着不同的东西:

  • 当您在第一种情况下比较2个数组时,您正在检查,如果这是相同的数组意味着内存中的位置,而不是数组的内容。
  • 在第二种情况下,String.equals实际检查这是否是相同的字符串。

答案 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 }));