我有这堂课:
public class MyClass{
private static Map<int[], Terrain> allTerrain = new HashMap<int[], Terrain>();
public static void main(String[] args){
populate();
int[] test = {0, 0};
System.out.println(allTerrain.get(test));
}
private static void populate() {
for (int i=0; i<10; i++) {
int[] index = {i, i};
allTerrain.put(index, new Terrain());
}
int[] test = {0, 0};
System.out.println(allTerrain.get(test));
}
}
在方法内部,allTerrain.get()
方法返回对象的实例,但是当我在方法之外使用allTerrain.get()
时,它会为所有条目返回null
。
一切都在主线程上运行,所以并发不是问题(我认为)。
关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
它不会从范围内外的allTerrain
地图中检索值。
null
null
问题是,当您在HashMap
中使用对象作为密钥时,需要以有用的方式实现hashcode
和equals
。具有相同值的数组不被视为相等。因此,他们没有引用相同的密钥
Boolean equal = new int[]{1, 2}.equals(new int[]{1, 2}) // is false
答案 1 :(得分:1)
不幸的是,使用数组作为地图的关键字将无法正常工作。 Can a java array be used as a HashMap key
也许尝试整数 https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html
答案 2 :(得分:0)
因为数组只有在相同的对象时才相等。一个int[]{0,0}
与另一个int[]{0,0}
不同。你可以定义一个类型类来存储复合键,或者我说使用lombok
@value
注释,它会创建合理的equals和hashCode方法。