A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

13 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报

你猜这是啥
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
6666
回复 使用道具 举报
   
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
厉害厉害
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马