黑马程序员技术交流社区
标题: 避免无意识的自动装箱 [打印本页]
作者: 奥斯托洛夫斯基 时间: 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
你猜这是啥
作者: 奥斯托洛夫斯基 时间: 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 |