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

时间:2014-09-30 13:26:02

标签: java performance hashmap jvm initialization

遇到了内联初始化Java地图这种特殊方式。

以下代码似乎使用匿名类扩展Hashmap类,然后使用(非静态)初始化程序块。

Map<String, String> aMap = new HashMap<String, String>()
{{
   put("gloves", "hand");
   put("hat", "head");
   put("shoes", "feet");
   put("scarf", "neck");
}};

使用上述代码内联初始化哈希映射的性能影响是什么?

我没有看到这种情况经常被使用。 它被认为是一种很好的java练习吗?

3 个答案:

答案 0 :(得分:1)

@davison这个问题已在SO上多次讨论过。 即使数据结构不一样(Set,HashSet)而不是(Map,HashMap),我个人认为以下是最好的讨论,应该澄清你所有的疑虑: Efficiency of Java "Double Brace Initialization"?

答案 1 :(得分:0)

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

编写此代码的更好方法是使用initialisation block

Map<String, String> aMap = new HashMap<String, String>();
{
    aMap.put("gloves", "hand");
    aMap.put("hat", "head");
    aMap.put("shoes", "feet");
    aMap.put("scarf", "neck");
}

答案 2 :(得分:0)

  

使用上述代码内联初始化哈希映射的性能影响是什么?

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

  

我没有看到这种情况经常被使用。它被认为是一个很好的Java实践吗?

我认为如果它使代码更清晰,特别是在单元测试中,这是一种很好的做法。

不好的做法是将此集合放入本地线程中,因为这会阻止模块卸载。