看看這個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