ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 如何直接初始化HashMap(以字面方式)?

2019-09-15 13:02:12  阅读:275  来源: 互联网

标签:java collections dictionary initialization


参见英文答案 > How can I initialise a static Map?                                    42个
有没有像这样初始化Java HashMap的方法?:

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

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

解决方法:

对于Java 9或更高版本:

是的,现在可以了.在Java 9中添加了几个简化地图创建的工厂方法:

// this works for up to 10 elements:
Map<String, String> test1 = Map.of(
    "a", "b",
    "c", "d"
);

// this works for any number of elements:
Map<String, String> test2 = Map.ofEntries(
    entry("a", "b"),
    entry("c", "d")
);

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

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

(另见JEP 269Javadoc)

对于Java版本8:

不,您必须手动添加所有元素.您可以在匿名子类中使用初始化程序来使语法更短一些:

Map<String, String> myMap = new HashMap<>() {{
        put("a", "b");
        put("c", "d");
    }};

但是,在某些情况下,匿名子类可能会引入不需要的行为.这包括例如:

>它会生成一个额外的类,这会增加内存消耗,磁盘空间消耗和启动时间
>在非静态方法的情况下:它包含对调用创建方法的对象的引用.这意味着在创建的地图对象仍被引用时,外部类的对象不能被垃圾收集,从而阻塞了额外的内存

使用初始化函数还可以在初始化程序中生成地图,但避免了令人讨厌的副作用:

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,collections,dictionary,initialization
来源: https://codeday.me/bug/20190915/1804827.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有