为什么我们在java中更喜欢原语和盒装原语
我正在阅读有效的
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对象.一次又一次,… 所以,你的程序在这里做的是:始终创建垃圾. 含义:这里对性能实际上有两个影响: >不必要的对象创建[在Java中相当便宜,但仍然比长值的简单计算“更昂贵”;后者可能只是一个,两个CPU指令;而对象创建将导致内存访问和相当一些CPU操作! ]>高速创建需要进行垃圾回收的对象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |