您的位置:首页 > 教程 > JAVA/JAVA编程 > Java中双大括号初始化的理解与使用

Java中双大括号初始化的理解与使用

2022-06-20 12:59:02 来源:易采站长站 作者:

Java中双大括号初始化的理解与使用

目录
对该方法的理解效率问题总结

偶然机会看到一种对象初始的方式:Hek站长之家-易采站长站-Easck.Com

    // 新建一个列表,并赋值 "Harry","Tony","Tom"
    ArrayList<String> friends = new ArrayList<String>() {{
        add("Harry");
        add("Tony");
        add("Tom");
    }};

当然,对Map集合也用同种初始化方式:Hek站长之家-易采站长站-Easck.Com

    // 新建一个Map,并赋值
    Map<String, Object> cat = new HashMap<String, Object>() {{
        put("name", "Tom");
        put("age", 10);
    }};

这里利用了内部类语法,这种方式比先new出对象然后再进行依次add要方便、简洁许多。该方法称之为“双括号初始化”(double brace initialization)。Hek站长之家-易采站长站-Easck.Com

Hek站长之家-易采站长站-Easck.Com

对该方法的理解

以ArrayList的初始化为例,第一层花括号,首先对定义了一个继承自ArrayList的匿名内部类Hek站长之家-易采站长站-Easck.Com

    ArrayList<String> friends = new ArrayList<String>() {
        // 这里什么操作都没有,全部继承自父类(ArrayList)
    };

第二层则是一个自定义的对象构造块(称之为 非静态初始化块)Hek站长之家-易采站长站-Easck.Com

    new ArrayList<String>() {
        // 这里什么操作都没有,全部继承自父类(ArrayList)
    };

我们通过new得到ArrayList的子类的实例化,然后上转型为ArrayList的引用Hek站长之家-易采站长站-Easck.Com

    ArrayList<String> friends = new ArrayList<String>() {{}};
    我们得到的 friends 实际上是ArrayList的子类的引用,但在功能上没有任何改变相比于常规标准方式进行初始化要简洁许多(但代码可读性相对会差)

    Hek站长之家-易采站长站-Easck.Com

    效率问题

    利用双大括号初始化集合从效率上来说可能不如标准的集合初始化步骤。原因在于使用双大括号初始化会导致内部类文件的产生,而这个过程就会影响代码的执行效率。Hek站长之家-易采站长站-Easck.Com

    首先查看不同初始化方式生成的.class文件Hek站长之家-易采站长站-Easck.Com

    例如以下代码:Hek站长之家-易采站长站-Easck.Com

    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列表为:Hek站长之家-易采站长站-Easck.Com

    Test1$1.classHek站长之家-易采站长站-Easck.Com
    Test1$2.classHek站长之家-易采站长站-Easck.Com
    Test1$3.classHek站长之家-易采站长站-Easck.Com
    Test1$4.classHek站长之家-易采站长站-Easck.Com
    Test1$5.classHek站长之家-易采站长站-Easck.Com
    ……Hek站长之家-易采站长站-Easck.Com
    …snip…Hek站长之家-易采站长站-Easck.Com
    ……Hek站长之家-易采站长站-Easck.Com
    Test1$1000.classHek站长之家-易采站长站-Easck.Com
    Test1.classHek站长之家-易采站长站-Easck.Com

    生成了 1001个.class文件Hek站长之家-易采站长站-Easck.Com

    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列表为:Hek站长之家-易采站长站-Easck.Com

    Test2.classHek站长之家-易采站长站-Easck.Com

    只生成了1个.class文件Hek站长之家-易采站长站-Easck.Com

    运行时间Hek站长之家-易采站长站-Easck.Com

    第一段代码Test1运行结果:Hek站长之家-易采站长站-Easck.Com

    1508379452224Hek站长之家-易采站长站-Easck.Com
    1508379452784Hek站长之家-易采站长站-Easck.Com

    运行时间为:560毫秒Hek站长之家-易采站长站-Easck.Com

    第二段代码Test2运行结果:Hek站长之家-易采站长站-Easck.Com

    1508379671505Hek站长之家-易采站长站-Easck.Com
    1508379671507Hek站长之家-易采站长站-Easck.Com

    运行时间为:2毫秒Hek站长之家-易采站长站-Easck.Com

    虽然说这个时间差距会根据电脑性能以及运行状态有所变化,但也能说明双大括号初始化方法要比常规方法用时长Hek站长之家-易采站长站-Easck.Com

    综上,(测试初始化数据较少(list未达到自增临界点)的情况下)双大括号初始化方法要比常规方法效率低:Hek站长之家-易采站长站-Easck.Com

    1. 双大括号初始化方法生成的.class文件要比常规方法多Hek站长之家-易采站长站-Easck.Com

    2. 双大括号初始化方法运行时间要比常规方法长Hek站长之家-易采站长站-Easck.Com

    Hek站长之家-易采站长站-Easck.Com

    总结

    到此这篇关于Java中双大括号初始化的理解与使用的文章就介绍到这了,更多相关Java双大括号初始化内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!Hek站长之家-易采站长站-Easck.Com

    如有侵权,请联系QQ:279390809 电话:15144810328

相关文章

  • Spring Cloud 整合Apache-SkyWalking实现链路跟踪的方法

    Spring Cloud 整合Apache-SkyWalking实现链路跟踪的方法

    什么是SkyWalking 查看官网https://skywalking.apache.org/ 分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。 安装 进入下载页面https://
    2020-06-18
  • 成功解决IDEA2020 Plugins 连不上、打不开的方法

    成功解决IDEA2020 Plugins 连不上、打不开的方法

    IntelliJ IDEA 2020.1 插件中心一直打不开,鉴于有部分同学反馈设置http proxy不能解决,所以可按以下顺序检查 一、设置 http proxy—勾上Auto-detect proxy setting,参照下图,加上地址 http://127.0.0
    2020-06-25
  • Java后台实现微信支付和微信退款

    Java后台实现微信支付和微信退款

    微信支付流程 都是我自己工作中开发的,亲测可用,不喜勿喷。 controller中我是这么写的,你们需要根据自己的业务需求改动。ResponseBean是我自己封装的,你们可以改成你们想要的形式
    2020-03-27
  • IDEA2020 1.1中Plugins加载不出来的问题及解决方法

    IDEA2020 1.1中Plugins加载不出来的问题及解决方法

    进入File-Setting 如图,取消勾选,点击确认后重启,点击了以后等一会就可以正常显示 ps:下面看下解决IDEA 2020.1.1 找不到程序包和符号 问题描述 IDEA 2020.1.1 maven项目build的时候报错,找
    2020-06-28
  • Intellij idea热部署插件JRebel的使用

    Intellij idea热部署插件JRebel的使用

    项目需求,一直用eclipse的我,也要改用IDEA了,一开始,很不习惯。经过几天的慢慢摸索和习惯之后,发现IDEA确实很好用。dark的界面是我喜欢的,智能的提示也让写代码不再枯燥。 遗
    2020-06-25
  • 详解基于IDEA2020.1的JAVA代码提示插件开发例子

    详解基于IDEA2020.1的JAVA代码提示插件开发例子

    之前因为项目组有自己的代码规范,为了约束平时的开发规范,于是基于2019.1.3版本开发了一个代码提示的插件。但是在把IDEA切换到2020.1版本的时候,却发现疯狂报错,但是网上关于
    2020-06-25
  • springboot + rabbitmq 如何实现消息确认机制(踩坑经验)

    springboot + rabbitmq 如何实现消息确认机制(踩坑经验)

    本文收录在个人博客:www.chengxy-nds.top,技术资源共享,一起进步 最近部门号召大伙多组织一些技术分享会,说是要活跃公司的技术氛围,但早就看穿一切的我知道,这 T M 就是为了刷
    2020-07-01
  • JetBrains IntelliJ IDEA 2020安装与使用教程详解

    JetBrains IntelliJ IDEA 2020安装与使用教程详解

    对于JetBrains IntelliJ IDEA 2020的认识 IntelliJ IDEA 2020是一款JAVA编程软件,捷克IntelliJ公司研发推出。该软件提供了一个非常强大的JAVA集成开发环境,不仅添加了对Records的完整代码洞察支持,
    2020-06-28