黑马程序员技术交流社区

标题: 避免无意识的自动装箱 [打印本页]

作者: 奥斯托洛夫斯基    时间: 2018-7-25 14:48
标题: 避免无意识的自动装箱
在无意识的自动装箱的情况下,会创建多余的对象。以下的计算int正值的总和,可以看出自动装箱之后的程序运行多消费的时长和性能:
public class AutoBoxingDemo {    public static void main(String[] args) {        //程序执行过程中构建了大约2的31次方的多余的Long实例        Long sum = 0L;        long start = System.currentTimeMillis();        for(long i = 0;i<Integer.MAX_VALUE ; i++){            //每次进行增加的时候都会构建一个Long类型的实例            sum += i;                    }        long end = System.currentTimeMillis();        long time = end - start;        System.out.println(time);        //System.out.println(sum);    }}
在定义sum的时候将l写成了L,导致程序运行是多构建了大约2的31次方的多余实例,消费的时间:

将封装类型的Long变成基本数据类型的long的时候:
public class AutoBoxingDemo2 {    public static void main(String[] args) {        //使用基本数据类型        long sum = 0L;        long start = System.currentTimeMillis();        for(long i = 0;i<Integer.MAX_VALUE ; i++){            sum += i;                    }        long end = System.currentTimeMillis();        long time = end- start ;        System.out.println(time);        //System.out.println(sum);    }}
消耗的时间为:
结论:要优先使用基本数据类型而不是装箱基本类型,要当心无意识的自动装箱
在effective java中说到,不要错误的认为:“创建对象的代价非常昂贵,我们应该要尽可能的避免创建对象”。相反,由于小对象的构造器只做很少量的显示工作,所以小对象的创建和回收动做是非常廉价的,特别是在JVM实现上更是如此,通过创建附加的对象,提升程序的清晰性,简洁性和功能性,这通常是件好事。反之通过维护自己的对象池类避免创建对象并不是一种好的做法,除非池中的对象是非常重量级的,典型对象示例就是数据库连接池。


作者: 摩西摩西OvO    时间: 2018-7-26 09:15

作者: O-limin    时间: 2018-8-9 17:30

作者: 项老师    时间: 2018-8-9 17:34

作者: TomGe    时间: 2018-8-9 17:36

作者: 奥斯托洛夫斯基    时间: 2018-8-9 17:36
O-limin 发表于 2018-8-9 17:30

你猜这是啥
作者: 奥斯托洛夫斯基    时间: 2018-8-9 17:36

作者: 天亮1    时间: 2018-8-9 17:38

作者: hguilin    时间: 2018-8-9 17:53
6666
作者: shengweiyun    时间: 2018-8-9 18:04
   
作者: 黑马啸西风    时间: 2018-8-9 18:39

作者: wishyouwerehere    时间: 2018-8-9 18:44

作者: 合肥黑马9期    时间: 2018-8-9 18:52

作者: ZC971227    时间: 2018-8-14 16:15
厉害厉害




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2