java双括号,
目录
对这种方法的理解效率问题总结偶然看到一种对象初始化的方式:
//新建一个列表,赋值 Harry , Tony , Tom ArrayList String Friends=New ArrayList String(){ { Add( Harry );添加(托尼);add( Tom );}};当然,映射集的初始化方式相同:
//新建一个Map并赋值mapstring,objectcat=newhashmapstring,object () {{put (name , Tom );put(年龄,10);}};这里使用了内部类语法,这比先创建新对象,然后进行顺序添加要方便和简洁得多。这种方法称为“双大括号初始化”。
00-1010以ArrayList初始化为例。第一个花括号定义了一个继承自ArrayList的匿名内部类。
ArrayList String Friends=new ArrayList String(){//这里什么都没有,都是继承自父类(ArrayList)};第二层是自定义对象构建块(称为非静态初始化块)。
New ArrayListString() {//这里什么都没有,全部继承自父类(ArrayList)};我们通过new得到ArrayList的子类的实例化,然后上转换成ArrayList的引用。
ArrayList string friends=new ArrayList string(){ { } };我们得到的朋友其实是对ArrayList子类的引用,只是功能上没有变化。与常规的标准初始化方式相比,它要简单得多(但代码可读性相对较差)。
00-1010使用双花括号初始化集合可能不如标准的集合初始化步骤有效。原因是用双括号初始化会导致内部类文件的生成,这个过程会影响代码执行的效率。
首先检查。不同初始化方法生成的类文件。
例如,下面的代码:
public class Test1 { public static void main(String[]args){ system . out . println(system . current time millis());ArrayList string list 1=new ArrayList string(){ { add( Harry );添加(托尼);add( Tom );add( Jerry );}};ArrayList string list 2=new ArrayList string(){ { add( Harry );添加(托尼);add( Tom );add( Jerry );}};ArrayList string list 3=new ArrayList string(){ { add( Harry );添加(托尼);add( Tom );add( Jerry );}};ArrayList string list 4=new ArrayList string(){ { add( Harry );添加(托尼);add( Tom );add( Jerry );}};ArrayListString list5=新数组列表
t<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毫秒
虽然说这个时间差距会根据电脑性能以及运行状态有所变化,但也能说明双大括号初始化方法要比常规方法用时长
综上,(测试初始化数据较少(list未达到自增临界点)的情况下)双大括号初始化方法要比常规方法效率低:
1. 双大括号初始化方法生成的.class文件要比常规方法多
2. 双大括号初始化方法运行时间要比常规方法长
总结
到此这篇关于Java中双大括号初始化的理解与使用的文章就介绍到这了,更多相关Java双大括号初始化内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。