Java自动装箱(autoboxing)的潜在危害剖析

自动装箱含义

由于Java1.5版本中,有一种创建多余对象的新方法,称为:自动装箱功能,它允许程序员将基本类型和装箱基本类型混用,按需要自动装箱和拆箱。

大多数人觉得2者基本没什么差别,但是通过下面的一段程序,会发现 性能上存在着明显的差别。


public static void main(String[] args) {
		
		long startTime = System.currentTimeMillis();
		Long sum = 0L;// 注意 此处sum定义的是Long类型
		
		for(long i=0; i<Integer.MAX_VALUE; i++){
			sum += i;
		}
		
		System.out.println(sum);
		long endTime = System.currentTimeMillis();
		
		System.out.println("总耗时:"+(endTime - startTime)/1000+"秒");
	}

执行该代码产生的结果如下:


那么我们将装箱基本类型改成我们熟知的基本类型之后代码如下:

public static void main(String[] args) {
		
		long startTime = System.currentTimeMillis();
		
		long sum = 0L;// 注意此处,sum类型为基本类型long
		
		for(long i=0; i<Integer.MAX_VALUE; i++){
			sum += i;
		}
		
		System.out.println(sum);
		long endTime = System.currentTimeMillis();
		
		System.out.println("总耗时:"+(endTime - startTime)/1000+"秒");
	}

执行得到的结果:


通过前后对比,我们都会大吃一惊吧,因为一个类型的区别,变量sum被声明成Long而不是long,意味着程序构造了大约2^31个多余的Long实例。

结论:

1、要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱。
2、要尽可能地避免创建对象。如果对象是属于轻量级的,那么现代的JVM实现上对小对象的创建和回收是非常廉价的,首要还是保证程序的清晰性、间接性和功能性。
3、如果是重量级的对象,我们可以考虑采用对象池进行维护。但是一般而言,维护自己的对象池必定会把代码弄的很乱,同时增加内存占用,并且损害性能。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值