java 如何赋值一个汉字,java - 如何直接初始化HashMap(以字面方式)?

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