看看这个Java代码:这是'长'如何工作(在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);
}
}
据观察,它需要更长的时间以来和这个代码是“长” &不是“长”。因此,在每次迭代中发生的事情是:
sum = new Long(sum.longValue() + i); (for sum+=i;)
因此,每次都会创建一个新对象。不支持Java类似于C++返回一个参考的功能,这样我们也许能写(可能):
sum.longValue() += i;
可能不必创建和对象中的循环每一次?我对吗?
总和为'long'的程序在1.660s运行,而这一个(总和为'Long')花费了9.367s。那么这是原因吗?并且Java不是每次都在循环中创建和? – amil
@AmitL:是的,拳击几乎肯定是原因。每次迭代都会调用Long.valueOf方法,但不一定会创建一个新的值。例如,-128和127之间的值保证被高速缓存。 –
示例代码将很快超出“{-128,127}”的范围。我认为可以肯定地说,在几乎每次迭代中,构造函数都会被调用(通过'Long.valueOf()')。至少在最初通过循环时。并且可能在随后的传递中,因为Java似乎不太可能在'Long'的Integer.MAX_VALUE'实例附近的任何地方缓存。 – aroth