2016-06-21 7 views
0

私は、同等性をチェックするためのテストコードを書いています。私はJavaのdocをチェックして、BigIntegerは不変であると言います。静的ファクトリメソッドvalueOfのドキュメントをチェックすると、すでにキャッシュされている不変インスタンスが返されるようです。だから、キャッシュされたインスタンスの場合、==はfalseを返します。以下はBigInteger.ValueOf()はキャッシュオブジェクトを返しますか?

BigIntegervalueOf用のJavaドキュメントです:

値が指定された 長いのと同等の大整数を返します

。この「静的ファクトリメソッド」は、頻繁に使用される BigIntegersの再利用が可能なため、 (long)コンストラクタよりも優先して提供されます。

以下のコードは無限ループに入っています。

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とは異なり、参照変数です。これは、intやdoubleで可能な限り "=="を使うことができないことを意味します。その代わりに、Stringと同じように.equals()を使用する必要があります。

+0

この場合、2番目の呼び出しによる '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

変更不可能とは、インスタンス化後に値を変更できないことを意味します。

具体的には、作成する各値のコピーが1つしかないことをJVMが保証する必要はありません。同じ内部状態を持つ多くの不変オブジェクトを作成できますが、それらは依然として別個のオブジェクトです。 ==とこれらを比較すると、falseが返され、equals()trueが返されます。 BigIntegerの

0

参照元:

//、-MAX_CONSTANT <ヴァル< MAX_CONSTANT、リターンは一定の

を隠しとMAX_CONSTANTは参照の等価のための16

関連する問題