自动装箱含义
由于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、如果是重量级的对象,我们可以考虑采用对象池进行维护。但是一般而言,维护自己的对象池必定会把代码弄的很乱,同时增加内存占用,并且损害性能。