尼古丁奥斯托洛夫斯基

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在无意识的自动装箱的情况下,会创建多余的对象。以下的计算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实现上更是如此,通过创建附加的对象,提升程序的清晰性,简洁性和功能性,这通常是件好事。反之通过维护自己的对象池类避免创建对象并不是一种好的做法,除非池中的对象是非常重量级的,典型对象示例就是数据库连接池。

posted on 2018-07-22 16:54  酷酷的COOL  阅读(115)  评论(0)    收藏  举报