我正在阅读有效的
java第二版和第23页说
// Hideously slow program! Can you spot the object creation public static void main(String[] args) { Long sum = 0L; for(long i=0; i<=Integer.MAX_VALUE; i++){ sum += i; } System.out.println(sum) }
作者说,上面的代码不必要地生成了2 ^ 31个对象实例.为什么sum = i生成新的Object?如果我将声明更改为
sum = sum + 1
没有这种副作用?
解决方法
试图以更清晰的方式改写其他人所说的内容:
sum的问题是Long是一个引用类型;换句话说,它是某种对象.对象生活在堆上;它们由JVM创建(使用“new”和构造函数),并由垃圾收集器“管理”.
自动装箱功能允许您使用该引用类型的Long变量,就像使用基本类型的长变量一样.
但Long对象是不可变的;一旦创建,它的价值永远不会改变.但整个循环是关于不断改变一个值(通过递增计数器)!因此,要递增计数器,您必须获取“当前”Long对象的值;加1;并将其填入下一个Long对象.一次又一次,…
所以,你的程序在这里做的是:始终创建垃圾.
换句话说:创建那些Long对象;使用一次(检索它们的价值);然后它们被“遗忘”(因为在任何地方都没有提到它们).因此他们立即有资格进行垃圾收集.
含义:这里对性能实际上有两个影响:
>不必要的对象创建[在Java中相当便宜,但仍然比长值的简单计算“更昂贵”;后者可能只是一个,两个cpu指令;而对象创建将导致内存访问和相当一些cpu操作! ]>高速创建需要进行垃圾回收的对象.