如何直接初始化HashMap(以字面方式)? 推荐| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看活动链接

提问:如何直接初始化HashMap(以字面方式)?

有没有办法像这样初始化Java HashMap?

Map<String,String> test = 
    new HashMap<String, String>{"test":"test","test":"test"};
复制代码

正确的语法是什么?我还没有发现任何有关此的信息。这可能吗?我正在寻找在地图中放置一些“最终/静态”值的最短/最快方法,这些值永远不会改变,并且在创建地图时会事先知道。

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

所有版本

如果您碰巧只需要一个条目:有Collections.singletonMap(“key”, “value”)。
对于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:
import static java.util.Map.entry;    
Map<String, String> test2 = Map.ofEntries(
    entry("a", "b"),
    entry("c", "d")
);
复制代码

在上面的示例中,两者test和test2相同,只是表达地图的方式不同。该Map.of方法最多可为地图中的十个元素定义,而该Map.ofEntries方法将没有此限制。

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

(另请参见JEP 269和Javadoc)
对于Java版本8:

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

Map<String, String> myMap = new HashMap<String, String>() {{
        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;
}
复制代码

文章翻译自 yl2gl72eozkinivz3vc6swkesy-ac4c6men2g7xr2a-translate.translate.goog/questions/6…

作者建议:乖乖的put吧,匿名内部类增加内存,也不好垃圾回收

hashmap很多讲的,比如jdk1.7的头插法成环问题,1.8解决的尾插法,hashmap的初始容量,扩容,hash算法、线程安全问题(concurrentHashMap-cas+sync), 还有一个就是计算size.

JDK1.8 size 是通过对 baseCount 和 counterCell 进行 CAS 计算,最终通过 baseCount 和 遍历 CounterCell 数组得出 size。主要是思想通过数组的方式,提高了吞吐。

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞? 求关注❤️ 求分享? 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享