java中自动装箱带来的性能问题
之前没有特别注意自动封装所带来的性能问题,今天看了effective java,实验了一下,结果大吃一惊;
考虑下面这段代码:
public static void main(String args[]){
Long sum =0L;
for(long i = 0;i < Integer.MAX_VALUE;i++){
sum+=i;
}
System.out.println(sum);
}
运行这段代码我机器耗时是7000ms;
我们再看下面这段代码:
public static void main(String args[]){
long sum =0L;
for(long i = 0;i < Integer.MAX_VALUE;i++){
sum+=i;
}
System.out.println(sum);
}
运行时所消耗的时间是1000ms;
这两段代码有什么区别呢,细心的小伙伴可能已经发现,sum的类型有区别,前一个是Long类型,
后一个是long类型;两个都是长整形,只是Long是对long的一个包装,但是在这个程序中运行速度却差异明显;
为什么呢?我们知道,在java 将long 转换为 Long 时,中间会生成Long对象,如果计算次数很多,其中每次又使用了java提供的自动装箱机制,
那么这个过程中就会出现大量的Long对象;以上的程序中就是这种情况,结果表明这对性能影响是很大的;
总结与反思:在大循环中应避免使用自动封装机制;