【问题标题】:Java: Performance Implications of Inline Initialization Of HashMaps [duplicate]Java:HashMap 的内联初始化的性能影响 [重复]
【发布时间】:2014-11-25 03:39:16
【问题描述】:

遇到了这种内联初始化 Java 映射的特殊方式。

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

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

使用上述代码内联初始化哈希图对性能有何影响?

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

【问题讨论】:

  • 你为什么不写一个测试应用程序来初始化一些测试图并自己看看?
  • 我想到的第一个问题是匿名类在编译后会产生一个extra .class 文件。关于性能...如果要在静态初始化中使用它(=在 JVM 中只使用一次),我认为性能不会有什么大不了的。不确定是否是一种好的做法,因为匿名类不可重用,并且扩展类应该旨在改变其行为。
  • @ZeroOne 正确地对 JIT 代码进行基准测试非常困难。在诉诸基准之前,必须了解为什么这样的事情应该会更快或更慢。

标签: java performance hashmap jvm initialization


【解决方案1】:

这不是一个好习惯,因为它创建了一个新的匿名内部类,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】:

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

【讨论】:

  • 感谢您指出!!在我的搜索中错过了这篇文章
  • 这看起来像是一条评论。如果您愿意,可以将问题标记为关闭 => 重复。
  • @Peter Lawrey thnx,我刚刚学会了如何将问题标记为重复 :)
  • @PeterLawrey 3000 rep 需要使用该功能,但可以放置一个标志。
【解决方案3】:

使用上述代码内联初始化哈希图对性能有何影响?

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

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

如果它使代码更清晰,尤其是在单元测试中,我会说这是一种很好的做法。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2023-03-03
    • 2021-05-16
    • 2013-01-13
    • 1970-01-01
    • 2017-07-23
    • 2011-06-12
    相关资源
    最近更新 更多