双大括号初始化的理解和使用
https://blog.csdn.net/xukun5137/article/details/78275201
偶然机会看到一种对象初始的方式:
当然,对Map集合也用同种初始化方式:
这里利用了内部类语法,这种方式比先new出对象然后再进行依次add要方便、简洁许多。该方法称之为“双括号初始化 ”(double brace initialization)。
对该方法的理解
以ArrayList的初始化为例,第一层花括号,首先对定义了一个继承自ArrayList的匿名内部类
第二层则是一个自定义的对象构造块 (称之为 非静态初始化块 )
我们通过new得到ArrayList的子类的实例化,然后上转型 为ArrayList的引用
- 我们得到的 friends 实际上是ArrayList的子类的引用 ,但在功能上没有任何改变
- 相比于常规标准方式进行初始化要简洁 许多(但代码可读性相对会差 )
效率问题
利用双大括号初始化集合从效率上来说可能不如标准的集合初始化步骤。原因在于使用双大括号初始化会导致内部类文件的产生,而这个过程就会影响代码的执行效率。
首先查看不同初始化方式生成的.class文件
例如以下代码:
Test1编译后生成的.class列表为:
生成了 1001个.class文件
Test2编译后生成的.class列表为:
只生成了1个.class文件
运行时间
第一段代码Test1运行结果:
运行时间为:560毫秒
第二段代码Test2运行结果:
运行时间为:2毫秒
虽然说这个时间差距会根据电脑性能以及运行状态有所变化,但也能说明双大括号初始化方法要比常规方法用时长
综上,(测试初始化数据较少(list未达到自增临界点)的情况下)双大括号初始化方法要比常规方法效率低:
1. 双大括号初始化方法生成的.class文件要比常规方法多
2. 双大括号初始化方法运行时间要比常规方法长