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

前端之家收集整理的这篇文章主要介绍了为什么我们在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对象.一次又一次,…

所以,你的程序在这里做的是:始终创建垃圾.
换句话说:创建那些Long对象;使用一次(检索它们的价值);然后它们被“遗忘”(因为在任何地方都没有提到它们).因此他们立即有资格进行垃圾收集.

含义:这里对性能实际上有两个影响:

>不必要的对象创建[在Java中相当便宜,但仍然比长值的简单计算“更昂贵”;后者可能只是一个,两个cpu指令;而对象创建将导致内存访问和相当一些cpu操作! ]>高速创建需要进行垃圾回收的对象.

原文链接:https://www.f2er.com/java/128242.html

猜你在找的Java相关文章