如何直接初始化HashMap(以文字的方式)?

有什么办法可以像这样初始化一个Java HashMap吗?

Map<String,String> test = 
    new HashMap<String, String>{"test":"test","test":"test"};

正确的语法是什么?我没有找到任何有关这方面的资料。这有可能吗?我正在寻找一种最短/最快的方法,将一些"最终/静态"值放入地图中,这些值永远不会改变,并且在创建地图时就已经知道了。

解决办法

适用于Java版本9或更高。

是的,现在可以这样做了。在Java 9中增加了几个工厂方法,简化了地图的创建。

// this works for up to 10 elements:
Map test1 = Map.of(
    "a", "b",
    "c", "d"
);

// this works for any number of elements:
Map test2 = Map.ofEntries(
    entry("a", "b"),
    entry("c", "d")
);

在上面的例子中,testtest2都是一样的,只是表达Map的方式不同。Map.of方法是针对地图中最多十个元素而定义的,而Map.ofEntries方法将没有这个限制。

注意,在这种情况下,产生的地图将是一个不可变的地图。如果你希望地图是可变的,你可以再次复制它,例如使用mutableMap = new HashMap(Map.of("a", "b");

(参见JEP 269Javadoc)

适用于Java版本8以下。

不,你将不得不手动添加所有的元素。你可以在匿名子类中使用一个初始化器来使语法更简短一些。

Map myMap = new HashMap() {{
        put("a", "b");
        put("c", "d");
    }};

然而,匿名子类在某些情况下可能会引入不需要的行为。这包括例如。

  • 它生成了一个额外的类,增加了内存消耗、磁盘空间消耗和启动时间
  • 在一个非静态方法的情况下。它持有一个对创建方法所调用的对象的引用。这意味着当创建的地图对象仍被引用时,外层类的对象不能被垃圾回收,从而阻塞了额外的内存。

使用一个函数进行初始化,也能使你在初始化器中生成一个地图,但避免了讨厌的副作用。

Map myMap = createMap();

private static Map createMap() {
    Map myMap = new HashMap();
    myMap.put("a", "b");
    myMap.put("c", "d");
    return myMap;
}
评论(13)

这是一种方法。

HashMap h = new HashMap() {{
    put("a","b");
}};

然而,你应该小心谨慎,确保你理解上述代码(它创建了一个继承自HashMap的新类)。因此,你应该多读读这里。 http://www.c2.com/cgi/wiki?DoubleBraceInitialization ,或者干脆使用Guava。

Map left = ImmutableMap.of("a", 1, "b", 2, "c", 3);
评论(13)
Map test = new HashMap()
{
    {
        put(key1, value1);
        put(key2, value2);
    }
};
评论(8)