问题
这个问题在这里已有答案:
- 如何初始化静态 Map ? 40个答案
有没有像这样初始化Java HashMap的方法?:
Map<String,String> test =
new HashMap<String, String>{"test":"test","test":"test"};
什么是正确的语法?我还没有发现任何相关的事情。这可能吗?我正在寻找最短/最快的方法,将一些“最终/静态”值放在一个永不改变的 Map 中,并在创建Map时提前知道。
#1 热门回答(864 赞)
这是一种方式。
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);
#2 热门回答(842 赞)
不,你必须手动添加所有元素。你可以使用静态初始化程序:
public class Demo
{
private static final Map<String, String> myMap;
static
{
myMap = new HashMap<String, String>();
myMap.put("a", "b");
myMap.put("c", "d");
}
}
请注意,使用函数进行初始化将执行相同操作,但可能会提高代码的可读性:
public class Demo
{
private static final 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;
}
}
#Java 9
在Java 9中添加了几个工厂方法,这些方法也可用于简化 Map 的创建:
public class Demo {
private static final Map<String, String> test = Map.of("a", "b", "c", "d");
private static final Map<String, String> test2 = Map.ofEntries(
entry("a", "b"),
entry("c", "d")
);
}
在上面的例子中,test
和test2
都是相同的,只是用不同的方式表达Map。 Map.of
方法是为 Map 中最多十个元素定义的,而Map.ofEntries
方法没有这样的限制。
请注意,在这种情况下,生成的 Map 将是不可变的 Map 。如果你希望 Map 是可变的,你可以再次复制它,例如使用mutableMap = new HashMap <>(Map.of(“a”,“b”));
#3 热门回答(262 赞)
如果你允许第三方库,你可以使用Guava的ImmutableMap来实现类似文字的简洁:
Map<String, String> test = ImmutableMap.of("k1", "v1", "k2", "v2");
这适用于高达5 key/value pairs,否则你可以使用其builder:
Map<String, String> test = ImmutableMap.<String, String>builder()
.put("k1", "v1")
.put("k2", "v2")
...
.build();
- 请注意,Guava的ImmutableMap实现与Java的HashMap实现不同(最值得注意的是它是不可变的,不允许空键/值)
- 有关更多信息,请参阅Guava关于其不可变集合类型的用户指南文章