2011-01-28 8 views
2

なぜDouble比較がfalseを返すのに対して、文字列比較はtrueを返しますか?Double変数の比較がfalseを返すのはなぜですか?

String s1 = "a"; 
String s2 = "a"; 
System.out.println(s1 == s2); // true 

Double d1 = 1D; 
Double d2 = 1D; 
System.out.println(d1 == d2); // false 

私はこの問題について考えていますが、まずはあなたの声を聞いて喜んでいます。

答えて

10

ストリングリテラルは自動化されています - 自動ボックバックダブルはではありません。これは-128から127までの値に対してを保証されているだけが、も同様に大きな値のため作業を得ること

Integer i1 = 1; 
Integer i2 = 1; 
System.out.println(i1 == i2); // true, guaranteed 

注:他のオートボクシングキャッシュされたオブジェクトを使用するように保証することができます。詳細については、section 5.1.7 of the JLSを参照してください。文字列のために、それは本当に唯一の理由は文字列定数のインターンであること

注:整数ボクシングのために、キャッシュされた値の再利用が実行時に行われるのに対し、...

String s1 = new String("a"); 
String s2 = new String("a"); 
System.out.println(s1 == s2); // false 

時間:

int x = 10; 
x -= 9; 
Integer i1 = x; 
Integer i2 = 1; 
System.out.println(i1 == i2); // true, guaranteed 
+0

@Stephen C:そう... –

+0

私はそれがJLSの一部であると推測します。参考リンクはありますか?答えが完全であるために:) – ptomli

+3

@ jon-skeet私はリフレッシュしたときにあなたの答えが成長し続ける方法が好きでした。 – dogbane

関連する問題