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

有没有办法像这样初始化Java HashMap?

Map<String,String> test = 

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

正确的语法是什么?我还没有发现任何有关此的信息。这可能吗?我正在寻找在地图中放置一些“最终/静态”值的最短/最快方法,这些值永远不会改变,并且在创建地图时会事先知道。

回答:

如果你碰巧只需要一个条目:有Collections.singletonMap("key", "value")

是的,现在有可能。在Java 9中,添加了一些工厂方法来简化地图的创建:

// this works for up to 10 elements:

Map<String, String> test1 = Map.of(

"a", "b",

"c", "d"

);

// this works for any number of elements:

import static java.util.Map.entry;

Map<String, String> test2 = Map.ofEntries(

entry("a", "b"),

entry("c", "d")

);

在上面的示例中,两者testtest2相同,只是表达地图的方式不同。Map.of最多可为地图中的十个元素定义该方法,而该Map.ofEntries方法没有此限制。

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

(另请参见JEP 269和Javadoc)

不,你将必须手动添加所有元素。你可以在匿名子类中使用初始化程序,以使语法短一些:

Map<String, String> myMap = new HashMap<String, String>() {{

put("a", "b");

put("c", "d");

}};

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

  • 它会生成一个附加类,从而增加内存消耗,磁盘空间消耗和启动时间
  • 对于非静态方法:它包含对创建方法所调用的对象的引用。这意味着在仍然引用创建的map对象的同时,无法对外部类的对象进行垃圾回收,从而阻塞了额外的内存

    使用函数进行初始化还将使你能够在初始化程序中生成映射,但避免了讨厌的副作用:

Map<String, String> myMap = createMap();

private static Map<String, String> createMap() {

Map<String,String> myMap = new HashMap<String,String>();

myMap.put("a", "b");

myMap.put("c", "d");

return myMap;

}

以上是 如何直接初始化HashMap(以文本方式)? 的全部内容, 来源链接: utcz.com/qa/430348.html

回到顶部