Java基元和原始包装器

Ven*_*k K 4 java garbage-collection heap-memory

我试图了解Java原语和包装器是如何工作的.让我们考虑以下示例.

Integer sum = 0;
for(int i = 0; i < 10000; ++i) {
    sum += i;
}
Run Code Online (Sandbox Code Playgroud)

由于Integer是不可变的并且是非原始的,因此该语句sum += i将被编译为如下

sum =  new Integer(sum.intValue() + i).
Run Code Online (Sandbox Code Playgroud)

这将创建大约10000个Integer对象(每次调用new Integer)以及sum.intValue()将Integer拆箱到int 的成本.

我对吗?

Ste*_*n C 6

不完全是.事实上:

    sum += i;
Run Code Online (Sandbox Code Playgroud)

相当于

    sum = Integer.valueOf(sum.intValue() + i);
Run Code Online (Sandbox Code Playgroud)

对于小整数值,Integer.valueOf(int)将返回缓存Integer对象.这意味着您将Integer创建少于10,000个新对象.

但"小"通常意味着-128到+127(IIRC)...因此差异不会很大.


正如Louis Wasserman所指出的那样,对象分配很便宜,"年轻时死"的对象的垃圾收集甚至更便宜.不过,你不应该不必要地使用原始包装器,特别是不要像这样的代码.