问题

这个问题在这里已有答案:

  • 如何初始化静态 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")
    );
}

在上面的例子中,testtest2都是相同的,只是用不同的方式表达Map。 Map.of方法是为 Map 中最多十个元素定义的,而Map.ofEntries方法没有这样的限制。

请注意,在这种情况下,生成的 Map 将是不可变的 Map 。如果你希望 Map 是可变的,你可以再次复制它,例如使用mutableMap = new HashMap <>(Map.of(“a”,“b”));

(另见JEP 269和theJavadoc)


#3 热门回答(262 赞)

如果你允许第三方库,你可以使用GuavaImmutableMap来实现类似文字的简洁:

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关于其不可变集合类型的用户指南文章

原文链接