Java 关于Map.containsValue方法的混淆

Java 关于Map.containsValue方法的混淆,java,hashmap,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

我有一个下面的程序,其中我有一个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));

为什么会这样?我哪里出错了?我错过的概念是什么?我觉得在这两种情况下我都在做同样的事情。我是java环境的新手,因此感到困惑。请帮助我澄清概念。

因为
Map.containsValue()
正在基于值类型的
.equals()
方法查找匹配项。
int[]
.equals()
方法有效地检查两个引用是否相同

您可以通过将
数组
变量放入映射中,然后询问映射是否包含
数组
变量来检查这一点。它应该返回true,因为它确实包含具有相同引用的
int[]


它对“point”起作用的原因是因为
“point”.equals(“point”)
返回true。

这是因为
布尔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 }));
看看

Map使用equals来确定值是否存在于Map中,但它的含义不同:

  • 在第一种情况下比较两个数组时,您检查的是同一个数组是否表示内存中的位置,而不是数组的内容
  • 在第二种情况下,String.equals实际上检查这是否是同一个字符串

使用IntBuffer或您自己的自定义类包装
int[]
并确保如果两个数组以相同顺序包含相同的值,则.equals()将返回true。
    map.put("a1", IntBuffer.wrap(new int[]{ 5, 20, 15, 20 }));
    boolean equals = map.containsValue(IntBuffer.wrap(new int[]{ 5, 20, 15, 20 }));