有没有办法像这样初始化Java HashMap?
Map<String,String> test = new HashMap<String, String>{"test":"test","test":"test"};
正确的语法是什么?我还没有发现任何有关此的信息。这可能吗?我正在寻找在地图中放置一些“最终/静态”值的最短/最快方法,这些值永远不会改变,并且在创建地图时会事先知道。
所有版本
如果你碰巧只需要一个条目:有Collections.singletonMap("key", "value")。
Collections.singletonMap("key", "value")
对于Java版本9或更高版本:
是的,现在有可能。在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") );
在上面的示例中,两者test和test2相同,只是表达地图的方式不同。Map.of最多可为地图中的十个元素定义该方法,而该Map.ofEntries方法没有此限制。
test
test2
Map.of
Map.ofEntries
请注意,在这种情况下,生成的地图将是不可变的地图。如果你希望地图可变,则可以再次复制它,例如使用mutableMap = new HashMap<>(Map.of("a", "b"));
mutableMap = new HashMap<>(Map.of("a", "b"));
(另请参见JEP 269和Javadoc)
对于Java版本8:
不,你将必须手动添加所有元素。你可以在匿名子类中使用初始化程序,以使语法短一些:
Map<String, String> myMap = new HashMap<String, String>() {{ put("a", "b"); put("c", "d"); }};
但是,在某些情况下,匿名子类可能会引入不需要的行为。例如,这包括:
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<String, String> h = new HashMap<String, String>() {{ put("a","b"); }};
但是,你应该小心并确保你理解上面的代码(它将创建一个继承自HashMap的新类)。因此,你应该在这里阅读更多信息: http ://www.c2.com/cgi/wiki?DoubleBraceInitialization,或仅使用Guava:
Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);