方法结束后,向HashMap添加条目将变为null

时间:2017-10-13 00:25:39

标签: java null hashmap

我有这堂课:

    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。 一切都在主线程上运行,所以并发不是问题(我认为)。 关于如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:2)

它不会从范围内外的allTerrain地图中检索值。

null
null

问题是,当您在HashMap中使用对象作为密钥时,需要以有用的方式实现hashcodeequals。具有相同值的数组不被视为相等。因此,他们没有引用相同的密钥

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方法。