在我的程序中,我想使用一个Integer []的HashMap,但我在检索数据时遇到了问题。经过进一步调查后,我发现程序中没有任何其他内容会打印null
。
HashMap<Integer[], Integer> a = new HashMap<Integer[], Integer>();
Integer[] b = {5, 7};
Integer[] c = {5, 7};
a.put(b, 2);
System.out.println(why.get(c));
如果我不必,我不想用a.keySet()
遍历HashMap。有没有其他方法可以达到预期的效果?
答案 0 :(得分:3)
数组基于从对象本身计算的散列而存储在映射中,而不是基于其中包含的值(使用==和使用数组的equals方法时会发生相同的行为)。
你的密钥应该是一个正确实现.equals和.hashCode而不是普通数组的集合。
答案 1 :(得分:0)
检查此代码是否有/所需行为:
// this is apparently not desired behaviour
{
System.out.println("NOT DESIRED BEHAVIOUR");
HashMap<Integer[], Integer> a = new HashMap<Integer[], Integer>();
Integer[] b = { 5, 7 };
Integer[] c = { 5, 7 };
a.put(b, 2);
System.out.println(a.get(c));
System.out.println();
}
// this is the desired behaviour
{
System.out.println("DESIRED BEHAVIOUR");
HashMap<List<Integer>, Integer> a = new HashMap<List<Integer>, Integer>();
int arr1[] = { 5, 7 };
List<Integer> b = new ArrayList<Integer>();
for (int x : arr1)
b.add(x);
int arr2[] = { 5, 7 };
List<Integer> c = new ArrayList<Integer>();
for (int x : arr2)
c.add(x);
System.out.println("b: " + b);
System.out.println("c: " + c);
a.put(b, 2);
System.out.println(a.get(c));
System.out.println();
}
<强>输出:强>
NOT DESIRED BEHAVIOUR
null
DESIRED BEHAVIOUR
b: [5, 7]
c: [5, 7]
2
您可能还想查看以下两个问题: