这个问题在这里已有答案:
有没有像这样初始化Java HashMap的方法?:
Map<String,String> test = new HashMap<String, String>{"test":"test","test":"test"};
什么是正确的语法?我还没有发现任何相关的事情 . 这可能吗?我正在寻找最短/最快的方法,将一些“最终/静态”值放在一个永不改变的 Map 中,并在创建Map时提前知道 .
这是一种方式 .
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);
没有直接的方法可以做到这一点 - Java没有Map文字(但我认为它们是针对Java 8提出的) .
有些人喜欢这样:
Map<String,String> test = new HashMap<String, String>(){{ put("test","test"); put("test","test");}};
这将创建一个HashMap的匿名子类,其实例初始化程序会放置这些值 . (顺便说一句, Map 不能包含两倍相同的值,第二个put会覆盖第一个 . 我将为下一个示例使用不同的值 . )
通常的方法是这个(对于局部变量):
Map<String,String> test = new HashMap<String, String>(); test.put("test","test"); test.put("test1","test2");
如果 test map是实例变量,请将初始化放在构造函数或实例初始化程序中:
test
Map<String,String> test = new HashMap<String, String>(); { test.put("test","test"); test.put("test1","test2"); }
如果 test map是类变量,请将初始化放在静态初始化程序中:
static Map<String,String> test = new HashMap<String, String>(); static { test.put("test","test"); test.put("test1","test2"); }
如果您希望 Map 永远不会更改,则应在初始化后通过 Collections.unmodifiableMap(...) 包装 Map . 您也可以在静态初始化程序中执行此操作:
Collections.unmodifiableMap(...)
static Map<String,String> test; { Map<String,String> temp = new HashMap<String, String>(); temp.put("test","test"); temp.put("test1","test2"); test = Collections.unmodifiableMap(temp); }
(我不确定你现在能否做出 test 最终......试试看并在这里报道 . )
Map<String,String> test = new HashMap<String, String>() { { put(key1, value1); put(key2, value2); } };
如果您允许第三方库,您可以使用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的用户指南文章immutable collection types
另一种方法是使用普通的Java 7类和varargs:使用以下方法创建一个类 HashMapBuilder :
HashMapBuilder
public static HashMap<String, String> build(String... data){ HashMap<String, String> result = new HashMap<String, String>(); 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<String,String> data = HashMapBuilder.build("key1","value1","key2","value2");
不,您必须手动添加所有元素 . 您可以使用静态初始化程序:
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中添加了几个工厂方法,这些方法也可用于简化 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 方法没有这样的限制 .
test2
Map.of
Map.ofEntries
请注意,在这种情况下,生成的 Map 将是不可变的 Map . 如果您希望 Map 是可变的,您可以再次复制它,例如使用 mutableMap = new HashMap<>(Map.of("a", "b"));
mutableMap = new HashMap<>(Map.of("a", "b"));
(另见JEP 269和Javadoc)
6 回答
这是一种方式 .
但是,您应该小心并确保您理解上面的代码(它创建一个继承自HashMap的新类) . 因此,您应该在这里阅读更多内容:http://www.c2.com/cgi/wiki?DoubleBraceInitialization,或者只是使用Guava:
没有直接的方法可以做到这一点 - Java没有Map文字(但我认为它们是针对Java 8提出的) .
有些人喜欢这样:
这将创建一个HashMap的匿名子类,其实例初始化程序会放置这些值 . (顺便说一句, Map 不能包含两倍相同的值,第二个put会覆盖第一个 . 我将为下一个示例使用不同的值 . )
通常的方法是这个(对于局部变量):
如果
test
map是实例变量,请将初始化放在构造函数或实例初始化程序中:如果
test
map是类变量,请将初始化放在静态初始化程序中:如果您希望 Map 永远不会更改,则应在初始化后通过
Collections.unmodifiableMap(...)
包装 Map . 您也可以在静态初始化程序中执行此操作:(我不确定你现在能否做出
test
最终......试试看并在这里报道 . )如果您允许第三方库,您可以使用Guava的ImmutableMap来实现类似文字的简洁:
这适用于5 key/value pairs,否则您可以使用其builder:
请注意,Guava的ImmutableMap实现与Java的HashMap实现不同(最值得注意的是它是不可变的并且不允许空键/值)
了解更多信息,请参阅Guava的用户指南文章immutable collection types
另一种方法是使用普通的Java 7类和varargs:使用以下方法创建一个类
HashMapBuilder
:使用这样的方法:
不,您必须手动添加所有元素 . 您可以使用静态初始化程序:
请注意,使用函数进行初始化将执行相同操作,但可能会提高代码的可读性:
Java 9
在Java 9中添加了几个工厂方法,这些方法也可用于简化 Map 的创建:
在上面的示例中,
test
和test2
都是相同的,只是表达Map的方式不同 .Map.of
方法是为 Map 中最多十个元素定义的,而Map.ofEntries
方法没有这样的限制 .请注意,在这种情况下,生成的 Map 将是不可变的 Map . 如果您希望 Map 是可变的,您可以再次复制它,例如使用
mutableMap = new HashMap<>(Map.of("a", "b"));
(另见JEP 269和Javadoc)