Anton Sorokin Asked:2020-02-09 23:26:43 +0000 UTC2020-02-09 23:26:43 +0000 UTC 2020-02-09 23:26:43 +0000 UTC 什么是双括号初始化? 772 Java中的语法{{ }}(两个双花括号)是什么意思? java 2 个回答 Voted Best Answer Anton Sorokin 2020-02-09T23:26:43Z2020-02-09T23:26:43Z 使用双括号进行初始化会创建一个从指定类派生的匿名类,并在内部提供一个初始化块。几乎总是用于初始化集合。 例子: new ArrayList<Integer>() {{ add(1); add(2); }}; ArrayList- "main",外部类,第一个括号是外部类的括号,第二个括号是初始化块的括号。括号内的空间是初始化块。 this生成的类有一个指向外部类的隐式指针。虽然通常不是问题,但在某些情况下它可能很糟糕(由于类生成),例如序列化或垃圾收集,值得关注。 List.ofJava 9 引入了,Set.of和Map.of应该使用的便捷方法。它们比双括号初始化器更快、更有效。 使用此设计时的问题: 1.你创建了太多匿名类 每次使用双重初始化时,都会创建一个新类。 例子 Map source = new HashMap(){{ put("firstName", "John"); put("lastName", "Smith"); put("organizations", new HashMap(){{ put("0", new HashMap(){{ put("id", "1234"); }}); put("abc", new HashMap(){{ put("id", "5678"); }}); }}); }}; 将创建这些类: Test$1$1$1.class Test$1$1$2.class Test$1$1.class Test$1.class Test.class 当然,这并不多,但是如果你使用这个结构 10-100-1000 次,那么你只是为了语法糖而使用了大量的内存。 2. 您可能会造成内存泄漏! 如果您使用以下代码,例如在方法中,则该方法的调用者可能不会意识到 GC 无法收集的太大资源。 更多关于使用双括号 (enSO) 时的性能。 1个带双括号的初始化示例: private static class IndustrialRaverMonkey extends Creature.Base {{ life = 46; strength = 35; charisma = 91; weapon = 2; }} private static class DwarvenAngel extends Creature.Base {{ life = 540; strength = 6; charisma = 144; weapon = 50; }} rfq 2020-02-10T22:48:40Z2020-02-10T22:48:40Z 内花括号相当于声明一个没有参数的构造函数: class Clazz {{System.out.println("hello");}} 和 class Clazz { Clazz(){ System.out.println("hello"); } }
使用双括号进行初始化会创建一个从指定类派生的匿名类,并在内部提供一个初始化块。几乎总是用于初始化集合。
例子:
ArrayList- "main",外部类,第一个括号是外部类的括号,第二个括号是初始化块的括号。括号内的空间是初始化块。this生成的类有一个指向外部类的隐式指针。虽然通常不是问题,但在某些情况下它可能很糟糕(由于类生成),例如序列化或垃圾收集,值得关注。List.ofJava 9 引入了,Set.of和Map.of应该使用的便捷方法。它们比双括号初始化器更快、更有效。使用此设计时的问题:
1.你创建了太多匿名类
每次使用双重初始化时,都会创建一个新类。
例子
将创建这些类:
当然,这并不多,但是如果你使用这个结构 10-100-1000 次,那么你只是为了语法糖而使用了大量的内存。
2. 您可能会造成内存泄漏! 如果您使用以下代码,例如在方法中,则该方法的调用者可能不会意识到 GC 无法收集的太大资源。
更多关于使用双括号 (enSO) 时的性能。
1个带双括号的初始化示例:
内花括号相当于声明一个没有参数的构造函数:
和