Java中双大括号初始化的理解与使用
作者:不如一默 发布时间:2023-08-30 08:44:55
偶然机会看到一种对象初始的方式:
// 新建一个列表,并赋值 "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.class
Test1$2.class
Test1$3.class
Test1$4.class
Test1$5.class
……
…snip…
……
Test1$1000.class
Test1.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运行结果:
1508379452224
1508379452784
运行时间为:560毫秒
第二段代码Test2运行结果:
1508379671505
1508379671507
运行时间为:2毫秒
虽然说这个时间差距会根据电脑性能以及运行状态有所变化,但也能说明双大括号初始化方法要比常规方法用时长
综上,(测试初始化数据较少(list未达到自增临界点)的情况下)双大括号初始化方法要比常规方法效率低:
1. 双大括号初始化方法生成的.class文件要比常规方法多
2. 双大括号初始化方法运行时间要比常规方法长
来源:https://blog.csdn.net/xukun5137/article/details/78275201


猜你喜欢
- 前言:最近突然喜欢上一句诗:“宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒。” 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活
- 本文实例为大家分享了java实现人工智能化屏幕监控窗口的具体代码,供大家参考,具体内容如下具体代码实现(含注释)public class M
- @ConditionalOnMissingBean,它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果而注册相同类型的
- 前言在项目开发过程中,时常会碰到这种情况:1.同一个Project的同一个API,有几个不同的接口,比如内部测试用的Server,和当前版本
- resultMap的Colum和property属性1: resultMap标签当我们的数据库字段与实体类的属性不一致时,就需要使用该标签进
- 简介Java注解是JDK1.5引入的一种注释机制,它不会改变编译器的编译方式,Java编译器对包含注解和不包含注解的代码会生成相同的Java
- 本文实例为大家分享了Java实现酒店客房管理系统的具体代码,供大家参考,具体内容如下LoginFrame.javapackage login
- 软件下载可以在官网下载,均为免费软件有问题可以联系我邮箱求助:sexluna@outlook.comsublime text3虽然收费但是支
- 1.写个Mybatis-plus配置类:是通过 * 实现分页@Configurationpublic class MybatisConfig
- 本文实例讲述了Java实现整数分解质因数的方法。分享给大家供大家参考,具体如下:题目内容:每个非素数(合数)都可以写成几个素数(也可称为质数
- 数独简介数独(shù dú)是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏
- 如何实现 WPF 代码查看器控件框架使用.NET40;Visual Studio 2019;代码展示需要使用到AvalonEdit是基于WP
- 一、项目概述之前有不少粉丝私信我说,能不能用Android原生的语言开发一款在手机上运行的游戏呢?说实话,使用java语言直接开发游戏这个需
- 前文常用的控件介绍了不少,现在就来讨论一下手机开发中常用到的画图。要掌握Android的画图,首先就要了解一下,基本用到的如下一些图形接口:
- 如何用idea创建web框架和配置struts 创建好一个project右键project,选择第二项选中Web Application,然
- 前言现在很多web应用,做过web项目的童鞋都知道,web结果由html+js+css组成,html结构都有一定的规范,数据动态交互可以通过
- 简单介绍华为鸿蒙系统应用开发工具 DevEco Studio的安装和使用据说12月份鸿蒙系统会推出手机的SDK哦,作为一名普通的开发者,表示
- 文件移动是计算机资源管理常用的一个操作,这在操作系统中可以通过文件的剪切与复制或鼠标拖动来实现。但是在Java文件的编程实现中,大多是通过复
- 一、系统介绍 1.系统功能登录系统查询信息新增信息修改信息删除信息2.环境配置JDK版本:1.8Mysql:8.0.133.数据库
- 下面是自己写的三个方法,直接类名.方法即可调用,注意此处未做异常处理.1.下划线转驼峰 lowerLineToHump()2.首字母大写 c