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 的成本.
我对吗?
不完全是.事实上:
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所指出的那样,对象分配很便宜,"年轻时死"的对象的垃圾收集甚至更便宜.不过,你不应该不必要地使用原始包装器,特别是不要像这样的代码.
| 归档时间: |
|
| 查看次数: |
1069 次 |
| 最近记录: |