看看这个Java代码:
class PerformanceTest2{
public static void main(String args[]){
Long sum = 0L;
for(int i=0;i<Integer.MAX_VALUE;i++)
sum += i;
System.out.println("Sum = " + sum);
}
}
Run Code Online (Sandbox Code Playgroud)
据观察,此代码需要更长的时间,因为sum是'Long'而不是'long'.所以在每次迭代中会发生什么:
sum = new Long(sum.longValue() + i); (for sum+=i;)
Run Code Online (Sandbox Code Playgroud)
因此,每次都会创建一个新对象.Java不支持C++返回引用的功能,以便我们可以编写(可能):
sum.longValue() += i;
Run Code Online (Sandbox Code Playgroud)
可能不必每次在循环周围创建sum对象?我对吗?
好吧,它不会调用构造函数.它用:
for (int i = 0; i < Integer.MAX_VALUE; i++)
{
long tmp = sum.longValue(); // Unboxing
tmp += i;
sum = Long.valueOf(tmp); // Boxing
}
Run Code Online (Sandbox Code Playgroud)
包装器对象是故意不可变的 - 它们很容易设计成可变的,但不变性通常是一个非常有用的功能.如果你想编写自己的可变包装类型,我们非常欢迎你 - 在这一点上你可以拥有如下代码:
LongWrapper sum = new LongWrapper(0L);
for (int i = 0; i < Integer.MAX_VALUE; i++)
{
sum.add(i);
}
System.out.println("Sum = " + sum);
Run Code Online (Sandbox Code Playgroud)
或者可能:
LongWrapper sum = new LongWrapper(0L);
for (int i = 0;i < Integer.MAX_VALUE; i++)
{
sum.setValue(sum.getValue() + i);
}
System.out.println("Sum = " + sum);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
506 次 |
| 最近记录: |