首页 文章

如何直接初始化HashMap(以字面方式)? [重复]

提问于
浏览
791

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

有没有像这样初始化Java HashMap的方法?:

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

什么是正确的语法?我还没有发现任何相关的事情 . 这可能吗?我正在寻找最短/最快的方法,将一些“最终/静态”值放在一个永不改变的 Map 中,并在创建Map时提前知道 .

6 回答

  • 92

    这是一种方式 .

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

    没有直接的方法可以做到这一点 - 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是实例变量,请将初始化放在构造函数或实例初始化程序中:

    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 . 您也可以在静态初始化程序中执行此操作:

    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 最终......试试看并在这里报道 . )

  • 56
    Map<String,String> test = new HashMap<String, String>()
    {
        {
            put(key1, value1);
            put(key2, value2);
        }
    };
    
  • 945

    如果您允许第三方库,您可以使用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();
    
  • 41

    另一种方法是使用普通的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");
    
  • 949

    不,您必须手动添加所有元素 . 您可以使用静态初始化程序:

    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 269Javadoc

相关问题