加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

为什么我们在java中更喜欢原语和盒装原语

发布时间:2020-12-15 02:55:40 所属栏目:Java 来源:网络整理
导读:我正在阅读有效的 java第二版和第23页说 // Hideously slow program! Can you spot the object creationpublic static void main(String[] args) { Long sum = 0L; for(long i=0; i=Integer.MAX_VALUE; i++){ sum += i; } System.out.println(sum)} 作者说,
我正在阅读有效的 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操作! ]>高速创建需要进行垃圾回收的对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读