Java:HashMaps内联初始化的性能影响

Java: Performance Implications of Inline Initialization Of HashMaps

本问题已经有最佳答案,请猛点这里访问。

遇到了这种独特的初始化Java地图的方法。

以下代码似乎正在使用匿名类扩展hashmap类,然后使用(非静态)初始值设定项块。

1
2
3
4
5
6
7
Map<String, String> aMap = new HashMap<String, String>()
{{
   put("gloves","hand");
   put("hat","head");
   put("shoes","feet");
   put("scarf","neck");
}};

使用上述代码以内联方式初始化哈希映射的性能含义是什么?

我没见过这个经常使用。它被认为是一个很好的Java实践吗?


@戴维森这个问题已经讨论了很多次了。即使数据结构不同(set,hashset),而不是(map,hashmap),我个人认为以下是最好的讨论,应该澄清您的所有疑问:Java"双括号初始化"的效率?


What are the performance implication of using the above code to initialize hashmaps inline?

几乎没有。第一次这样做时,会有额外的类加载,除非您关心所使用的类的数量,否则这不太重要。

I have not seen this being used very often. Is it considered to be a good java practice ?

如果它能使代码更清晰,特别是在单元测试中,我会说这是一个很好的实践。

不好的做法是,如果将此集合放入本地线程中,因为这样可以防止模块卸载。


这不是一个好的实践,因为它创建了一个新的匿名内部类,JVM必须使用更多的内存来跟踪它。除此之外,它基本上是无害的。

编写此代码的更好方法是使用初始化块:

1
2
3
4
5
6
7
Map<String, String> aMap = new HashMap<String, String>();
{
    aMap.put("gloves","hand");
    aMap.put("hat","head");
    aMap.put("shoes","feet");
    aMap.put("scarf","neck");
}