java - 如何直接初始化HashMap(以字面方式)?
这个问题在这里已有答案:
如何初始化静态地图? 41个答案
有没有像这样初始化Java HashMap的方法?:
Map test =
new HashMap{"test":"test","test":"test"};
什么是正确的语法? 我还没有发现任何相关的事情。 这可能吗? 我正在寻找最短/最快的方法,将一些“最终/静态”值放在一个永不改变的地图中,并在创建Map时提前知道。
6个解决方案
940 votes
这是一种方式。
HashMap h = new HashMap() {{
put("a","b");
}};
但是,您应该小心并确保您理解上面的代码(它创建一个继承自HashMap的新类)。 因此,您应该在这里阅读更多内容:[http://www.c2.com/cgi/wiki?DoubleBraceInitialization],或只是使用番石榴:
Map left = ImmutableMap.of("a", 1, "b", 2, "c", 3);
gregory561 answered 2018-12-19T07:50:06Z
931 votes
不,您必须手动添加所有元素。 您可以使用静态初始化程序:
public class Demo
{
private static final Map myMap;
static
{
myMap = new HashMap();
myMap.put("a", "b");
myMap.put("c", "d");
}
}
请注意,使用函数进行初始化将执行相同操作,但可能会提高代码的可读性:
public class Demo
{
private static final Map myMap = createMap();
private static Map createMap()
{
Map myMap = new HashMap();
myMap.put("a", "b");
myMap.put("c", "d");
return myMap;
}
}
Java 9
在Java 9中添加了几个工厂方法,这些方法也可用于简化地图的创建:
public class Demo {
private static final Map test = Map.of("a", "b", "c", "d");
private static final Map test2 = Map.ofEntries(
entry("a", "b"),
entry("c", "d")
);
}
在上面的示例中,mutableMap = new HashMap<>(Map.of("a", "b"));和test2都是相同的,只是表达Map的方式不同。 Map.of方法是为地图中最多十个元素定义的,而Map.ofEntries方法没有这样的限制。
请注意,在这种情况下,生成的地图将是不可变的地图。 如果您希望地图是可变的,您可以再次复制它,例如 使用mutableMap = new HashMap<>(Map.of("a", "b"));
(另见JEP 269和Javadoc)
yankee answered 2018-12-19T07:49:42Z
291 votes
如果您允许第三方库,您可以使用Guava的ImmutableMap来实现类似文字的简洁:
Map test = ImmutableMap.of("k1", "v1", "k2", "v2");
这适用于最多5个键/值对,否则您可以使用其构建器:
Map test = ImmutableMap.builder()
.put("k1", "v1")
.put("k2", "v2")
...
.build();
请注意,Guava的ImmutableMap实现与Java的HashMap实现不同(最值得注意的是它是不可变的并且不允许空键/值)
有关更多信息,请参阅Guava的有关其不可变集合类型的用户指南文章
Jens Hoffmann answered 2018-12-19T07:50:40Z
91 votes
没有直接的方法可以做到这一点 - Java没有Map文字(但我认为它们是针对Java 8提出的)。
有些人喜欢这样:
Map test = new HashMap(){{
put("test","test"); put("test","test");}};
这将创建一个HashMap的匿名子类,其实例初始化程序会放置这些值。 (顺便说一句,地图不能包含两倍相同的值,第二个put会覆盖第一个。我将为下一个示例使用不同的值。)
通常的方法是这个(对于局部变量):
Map test = new HashMap();
test.put("test","test");
test.put("test1","test2");
如果您的test映射是实例变量,请将初始化放在构造函数或实例初始值设定项中:
Map test = new HashMap();
{
test.put("test","test");
test.put("test1","test2");
}
如果您的test映射是类变量,请将初始化放在静态初始化程序中:
static Map test = new HashMap();
static {
test.put("test","test");
test.put("test1","test2");
}
如果您希望地图永远不会更改,则应在初始化后将地图包装为test.您也可以在静态初始化程序中执行此操作:
static Map test;
{
Map temp = new HashMap();
temp.put("test","test");
temp.put("test1","test2");
test = Collections.unmodifiableMap(temp);
}
(我不确定你现在是否可以制作test ...试试看并在这里报道。)
Paŭlo Ebermann answered 2018-12-19T07:51:32Z
56 votes
Map test = new HashMap()
{
{
put(key1, value1);
put(key2, value2);
}
};
Shaggy Frog answered 2018-12-19T07:51:47Z
41 votes
另一种方法是使用普通Java 7类和varargs:使用此方法创建类HashMapBuilder:
public static HashMap build(String... data){
HashMap result = new HashMap();
if(data.length % 2 != 0)
throw new IllegalArgumentException("Odd number of arguments");
String key = null;
Integer step = -1;
for(String value : data){
step++;
switch(step % 2){
case 0:
if(value == null)
throw new IllegalArgumentException("Null key value");
key = value;
continue;
case 1:
result.put(key, value);
break;
}
}
return result;
}
使用这样的方法:
HashMap data = HashMapBuilder.build("key1","value1","key2","value2");
Aerthel answered 2018-12-19T07:52:11Z