遇到了内联初始化Java地图这种特殊方式。
以下代码似乎使用匿名类扩展Hashmap类,然后使用(非静态)初始化程序块。
Map<String, String> aMap = new HashMap<String, String>()
{{
put("gloves", "hand");
put("hat", "head");
put("shoes", "feet");
put("scarf", "neck");
}};
使用上述代码内联初始化哈希映射的性能影响是什么?
我没有看到这种情况经常被使用。 它被认为是一种很好的java练习吗?
答案 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实践吗?
我认为如果它使代码更清晰,特别是在单元测试中,这是一种很好的做法。
不好的做法是将此集合放入本地线程中,因为这会阻止模块卸载。