双大括号初始化的理解和使用
来源:互联网 发布:快速转换视频格式软件 编辑:程序博客网 时间:2024/06/06 04:37
偶然机会看到一种对象初始的方式:
// 新建一个列表,并赋值 "Harry","Tony","Tom" ArrayList<String> friends = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); }};
当然,对Map集合也用同种初始化方式:
// 新建一个Map,并赋值 Map<String, Object> cat = new HashMap<String, Object>() {{ put("name", "Tom"); put("age", 10); }};
这里利用了内部类语法,这种方式比先new出对象然后再进行依次add要方便、简洁许多。该方法称之为“双括号初始化”(double brace initialization)。
对该方法的理解
以ArrayList的初始化为例,第一层花括号,首先对定义了一个继承自ArrayList的匿名内部类
ArrayList<String> friends = new ArrayList<String>() { // 这里什么操作都没有,全部继承自父类(ArrayList) };
第二层则是一个自定义的对象构造块(称之为 非静态初始化块)
new ArrayList<String>() { // 这里什么操作都没有,全部继承自父类(ArrayList) };
我们通过new得到ArrayList的子类的实例化,然后上转型为ArrayList的引用
ArrayList<String> friends = new ArrayList<String>() {{}};
- 我们得到的 friends 实际上是ArrayList的子类的引用,但在功能上没有任何改变
- 相比于常规标准方式进行初始化要简洁许多(但代码可读性相对会差)
效率问题
利用双大括号初始化集合从效率上来说可能不如标准的集合初始化步骤。原因在于使用双大括号初始化会导致内部类文件的产生,而这个过程就会影响代码的执行效率。
首先查看不同初始化方式生成的.class文件
例如以下代码:
public class Test1 { public static void main(String[] args) { System.out.println(System.currentTimeMillis()); ArrayList<String> list1 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list2 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list3 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list4 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; ArrayList<String> list5 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; …… …snip… …… ArrayList<String> list1000 = new ArrayList<String>() {{ add("Harry"); add("Tony"); add("Tom"); add("Jerry"); }}; System.out.println(System.currentTimeMillis()); }}
Test1编译后生成的.class列表为:
Test1$1.classTest1$2.classTest1$3.classTest1$4.classTest1$5.class………snip………Test1$1000.classTest1.class
生成了 1001个.class文件
public class Test2 { public static void main(String[] args) { System.out.println(System.currentTimeMillis()); ArrayList<String> list1 = new ArrayList<>(); list1.add("Harry"); list1.add("Tony"); list1.add("Tom"); list1.add("Jerry"); ArrayList<String> list2 = new ArrayList<>(); list2.add("Harry"); list2.add("Tony"); list2.add("Tom"); list2.add("Jerry"); ArrayList<String> list3 = new ArrayList<>(); list3.add("Harry"); list3.add("Tony"); list3.add("Tom"); list3.add("Jerry"); ArrayList<String> list4 = new ArrayList<>(); list4.add("Harry"); list4.add("Tony"); list4.add("Tom"); list4.add("Jerry"); ArrayList<String> list5 = new ArrayList<>(); list5.add("Harry"); list5.add("Tony"); list5.add("Tom"); list5.add("Jerry"); …… …snip… …… ArrayList<String> list1000 = new ArrayList<>(); list1000.add("Harry"); list1000.add("Tony"); list1000.add("Tom"); list1000.add("Jerry"); System.out.println(System.currentTimeMillis()); }}
Test2编译后生成的.class列表为:
Test2.class
只生成了1个.class文件
运行时间
第一段代码Test1运行结果:
15083794522241508379452784
运行时间为:560毫秒
第二段代码Test2运行结果:
15083796715051508379671507
运行时间为:2毫秒
虽然说这个时间差距会根据电脑性能以及运行状态有所变化,但也能说明双大括号初始化方法要比常规方法用时长
综上,双大括号初始化方法要比常规方法效率低:
1. 双大括号初始化方法生成的.class文件要比常规方法多
2. 双大括号初始化方法运行时间要比常规方法长
阅读全文
0 0
- 双大括号初始化的理解和使用
- 对双大括号初始化的理解
- C++初始化列表和大括号里构造的区别
- javascript中{},[]中括号,大括号的含义和使用
- Java中的双大括号初始化的效率问题
- 对大括号{}的作用的理解
- 谈谈JS里的{ }大括号和[ ]中括号的用法,理解后就可以看懂JSON结构了。
- 谈谈JS里的{ }大括号和[ ]中括号的用法,理解后就可以看懂JSON结构了。
- 谈谈JS里的{ }大括号和[ ]中括号的用法,理解后就可以看懂JSON结构了。
- 谈谈JS里的{ }大括号和[ ]中括号的用法,理解后就可以看懂JSON结构了
- 多重复合类型变量初始化时的大括号问题
- PHP中的的大括号(花括号{})使用详解
- Makefile 中 大括号和小括号 的区别
- if条件句有大括号和没有大括号的区别
- Java双括号初始化
- List双括号初始化
- 双括号初始化
- Java双括号初始化
- Qt4.7开发吐槽(一)
- 使用 Load Balancer,Corosync,Pacemaker 搭建 Linux 高可用集群
- 迷宫和树等的BFS及DFS
- 推箱子第一关(存在bug)
- 开发ASP.NET MVC 在线录音录像(音视频录制并上传)
- 双大括号初始化的理解和使用
- 2015-2016 Northwestern European Regional Contest (NWERC 2015)
- plsql安装过程所遇问题及解决方法记录
- 【Oracle】wmsys.wm_concat函数字段值为空
- 客户信息管理系统4—客户信息的查询
- jar包和war包的介绍与区别
- springboot热部署
- 中科软深圳分公司面试题
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)