Java:哈希映射内联初始化的性能影响

Java:哈希映射内联初始化的性能影响,java,performance,hashmap,jvm,initialization,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"); }}; Map

遇到了这样一种奇特的方式,即以内联方式初始化Java映射

下面的代码似乎是使用匿名类扩展Hashmap类,然后使用(非静态)初始值设定项块。

Map<String, String> aMap = new HashMap<String, String>()
{{
   put("gloves", "hand");
   put("hat", "head");
   put("shoes", "feet");
   put("scarf", "neck");
}};
Map aMap=newhashmap()
{{
放置(“手套”、“手”);
放置(“帽子”、“头”);
放置(“鞋”、“脚”);
放(“围巾”、“脖子”);
}};
使用上述代码内联初始化哈希映射的性能影响是什么?


我还没有看到这被经常使用这被认为是一个好的java实践吗?

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

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

Map aMap=newhashmap();
{
aMap.put(“手套”、“手”);
“帽子”、“头”);
aMap.put(“鞋”、“脚”);
头巾、脖子;
}

@davison这个问题已经讨论过很多次了。 即使数据结构不同(Set,HashSet),而不是(Map,HashMap),我个人认为以下是最好的讨论,应该澄清您的所有疑问:

使用上述代码内联初始化hashmaps的性能意味着什么

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

我还没有看到这被经常使用。这被认为是一种好的java实践吗

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


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

为什么不编写一个测试应用程序来初始化一些测试映射并亲自查看呢?我想到的第一个问题是,匿名类在编译后会生成一个额外的.class文件。关于性能。。。如果在静态初始化中使用它(在JVM中仅使用一次),我认为性能并不是什么大问题。因为匿名类是不可重用的,扩展一个类的目的应该是改变它的行为,所以不确定它是否是一个好的实践。@ZeroOne正确地对JIT代码进行基准测试是极其困难的。在使用基准测试之前,必须了解为什么这样的测试应该更快或更慢。谢谢你指出!!在我的搜索中错过了这篇文章。这看起来像是一条评论。如果愿意,您可以将问题标记为close=>duplicate。@Peter Lawrey thnx,我刚刚学习了如何将问题标记为duplicate:)@PeterLawrey需要使用该功能,但也可以放置一个标记。如果您创建所使用的每个字节,您可能希望减少初始容量。
Map<String, String> aMap = new HashMap<String, String>();
{
    aMap.put("gloves", "hand");
    aMap.put("hat", "head");
    aMap.put("shoes", "feet");
    aMap.put("scarf", "neck");
}