others - 如何直接初始化HashMap (具体方式) ?

有没有类似于这样初始化Java HashMap的方法?


Map<String,String> test = 
 new HashMap<String, String>{"test":"test","test":"test"};

正确的语法是什么?

时间:

没有,你必须手动添加所有元素,但是,你可以使用static初始值设定项:


public class Demo
{
 private static final Map<String, String> myMap;
 static
 {
 myMap = new HashMap<String, String>();
 myMap.put("a","b");
 myMap.put("c","d");
 }
}

这是一种方法。


 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);

使用guava,你可以执行以下操作:


Map<String,String> test = ImmutableMap.of("k1","v1","k2","v2");

(为了实现完整性,如果允许第三方库),


如果你需要更多,使用它的生成器 :


Map<String,String> test = ImmutableMap.<String, String>builder()
 .put("k1","v1")
 .put("k2","v2")
 ...
 .build();


你可以在他们的用户指南中 找到Guava Collection更多信息。

有些人喜欢这样:


Map<String,String> test = new HashMap<String, String>(){{
 put("test","test"); put("test","test");}};

这将创建HashMap的一个匿名子类,其实例初始值设定项设置这些值,(顺便说一下,一个map 不能包含两个相同的值),第二个将覆盖第一个。

通常的方法是这个(对于局部变量):


Map<String,String> test = new HashMap<String, String>();
test.put("test","test");
test.put("test1","test2");

如果test映射是实例变量,请将初始化放在构造函数或实例初始值设定项中:


Map<String,String> test = new HashMap<String, String>();
{
 test.put("test","test");
 test.put("test1","test2");
}

如果test映射是类变量,请将初始化放在static初始值设定项中:


static Map<String,String> test = new HashMap<String, String>();
static {
 test.put("test","test");
 test.put("test1","test2");
}

如果你希望map 永远不会改变,你应该在初始化map 时将map 包装到Collections.unmodifiableMap(...) ,你也可以在static初始值设定项中执行这个操作:


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);
}

一种替代方法,使用普通的Java 7类和varargs : 使用此方法创建类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");

...