双支架初始化 - 优势

Raj*_*ana 8 java collections initialization

我们知道我们可以通过使用双括号初始化来初始化java中的集合.并对此进行了一些搜索,发现由于其性能问题,不建议使用它.

private static final Set<String> VALID_CODES = new HashSet<String>() {{
    add("XZ13s");
    add("AB21/X");
    add("YYLEX");
    add("AR2D");
 }};
Run Code Online (Sandbox Code Playgroud)

只是想知道,双支撑初始化有任何积极的一面或优势吗?

Pet*_*rey 6

不建议使用它,因为它的性能问题.

我没有看到任何性能问题.每当你看到有人说我出于性能原因而做了/没有做某事时,你应该期待看到详细的分析,比较解释如何满足特定要求的性能而另一个没有满足的替代方案.如果你没有看到这一切,你可能会认为作者只是在猜测.

编辑:虽然我承认每个类需要花费少量时间来加载,但运行性能完全相同.我在这里演示了 /sf/answers/1023908791/

如果您认为它更简单,更清晰,我会使用双括号表示法.

缺点是您正在更改集合的类型,这可能会混淆不期望的函数.例如等于.

注意:正如Lukas Eder指出的那样,如果你在非静态环境中这样做,你要小心.匿名子类集合将隐式地具有对外部实例的引用,并且如果它比集合长,则这将是内存泄漏. 你有没有想过内存泄漏的可能性?

  • @AlvinWong那个测试似乎相当破碎 - 特别是每当我看到测试返回"0 ms"时,我的第一个猜测是代码没有运行(在这种情况下这是完全合法的,因为结果从未使用过).JVM也没有正常预热......我不相信这些结果. (2认同)
  • Peter,扩展HashMap/Set可能会强制进行类层次结构分析,而不需要执行IO.更多的加载类的成本并不总是微不足道 - 比方说,在多层类加载器结构(应用程序服务器,特别是启用RMI类加载!),即每个委托给父(必须),搜索JAR /文件系统,纾困回到当前的类加载器最终加载anon.类.再次微基准测试不足以证明一个案例.Imo,"双支撑"不是一个真正糟糕的做法. (2认同)