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