2016-06-21 24 views
0

我寫了一個測試代碼來檢查相等性。我檢查了Java文檔,它說BigInteger是不可變的。檢查靜態工廠方法valueOf的文檔,它看起來像返回已經緩存的不可變實例。那麼爲什麼當它的緩存實例時==會返回false。BigInteger.ValueOf()返回緩存的對象?

下面是valueOfBigInteger在Java文檔:

返回一個大整數,其值等於指定 長。這種「靜態工廠方法」優先於 (長)構造函數提供,因爲它允許重複使用經常使用的BigIntegers BigIntegers。

下面的代碼進入無限循環。

public static void main(String[] args) { 
    while(true) { 
     BigInteger a = BigInteger.valueOf(100); 
     BigInteger c = BigInteger.valueOf(100); 
     if (a == c) { 
      break; 
     } 
} 
+2

''==測試爲參考平等, '.equals()'測試值是否相等 – azurefrog

+0

使用'equal()'檢查是否相等。 – Li357

+1

對於原始類型'=='比較值,但對於它比較引用的對象。 – Gendarme

回答

2

BigInteger是一個引用變量,不像int或double,它們是原始變量。這意味着您不能像使用整數或雙精度使用「==」。相反,你必須使用.equals(),類似於你如何使用String。

+0

在這種情況下,第二次調用的'valueOf'應該返回對同一個對象的引用。 – Jagger

+0

@Jagger'valueOf'沒有指定任何類型的緩存行爲。它被允許緩存,但絕不是這個義務。 –

+0

@LouisWasserman是的,你是對的。例如,這個'BigInteger.valueOf(100L)== BigInteger.valueOf(100L)'返回'false',這個'BigInteger.valueOf(1L)== BigInteger.valueOf(1L)'返回'true'。 – Jagger

-1

==檢查引用而不是實際內容。出於這個原因,==通常用於像int,float等原始數據類型。不可變意味着每當更新現有值時,它都不會被修改,而是會創建一個新的值。因此,在您的示例中,即使兩個物理物體的物理參數值不同,也是如此。

+0

這個答案不清楚或不正確 – ControlAltDel

6

不可變意味着只有在實例化後該值不能改變。

具體而言,它並不意味着JVM必須確保每個值的創建只有一個副本。您可以創建許多具有相同內部狀態的不可變對象,但它們仍然是不同的對象。將這些與==進行比較將返回false,而equals()將返回true

0

見BigInteger的源:

//如果-MAX_CONSTANT < VAL < MAX_CONSTANT,返回藏匿恆定

和MAX_CONSTANT是16