2011-12-08 7 views
19

可能性の重複:
Integer wrapper objects share the same instances only within the value 127?一部のIntegerオブジェクトではなぜ== trueですか?

私はハーリドムガールSCJPから次のプログラムスニペットをコピーしてきたが、私は
には、出力を理解できないのです。

public class RQ200_60 { 
    public static void main(String[] args) { 
     Integer i = -10; 
     Integer j = -10; 
     System.out.print(i==j);   // output: true -- why true? 
     System.out.print(i.equals(j)); // output: true 
     Integer n = 128; 
     Integer m = 128; 
     System.out.print(n==m);   // output: false 
     System.out.print(n.equals(m)); // output: true 
    } 
}  

最初のprint文のための真の出力を与える上記のプログラムが、それは==関係演算子と参照比較であるため、それが偽与えることになって。しかし、3番目の印刷物は虚偽であり、私はこの矛盾を理解していません。

説明をいただければ幸いです。

+1

http://stackoverflow.com/の範囲を超え質問/ 7309640/compare-two-integer、http://stackoverflow.com/questions/5581913/wrapper-class-and-operator、http://stackoverflow.com/questions/5117132/wrapper-objects-share-the-同じアドレス空間だけの値127、http://stackoverflow.com/questions/5865056/integer-construction-variations –

答えて

33

最初のケースでは、オブジェクトijの両方が同じキャッシュオブジェクトを指しています。デフォルトでは、-128〜127の範囲はIntegerオブジェクトとしてキャッシュされます。範囲を増やすことができますJVM arguments

+5

+1興味深いことに、設定可能であるかどうかは分かりませんでした。 –

+3

私はまたそれが構成可能であることを知らなかった。 [JLS 5.1.7](http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7)に従って、-128から127 *までの自動ボクシング値は同一でなければなりません) – yshavit

8

整数オブジェクトは、値が0に近い値でキャッシュされることがあります(実装の仕様によって詳細がわかります)。これはおそらくメモリを節約することになります(0に近い値が一般的です。同じ値を持つすべての変数に対して新しいオブジェクトを作成するために多くのメモリを消費します)。

==は、2つのものが同じオブジェクトであるかどうかをチェックします。 は、同じ値を持つ任意の2つの変数に対して同じIntegerオブジェクトを持つ場合としない場合があります。 が気になるはずではないので、==で確認する必要はありません同じオブジェクトであるかどうか。そのアイデンティティではなく、重要であるのはIntegerの値です。

11

キャッシングに関する回答は正しいです。しかし、あなたが行く場合...

Integer i = new Integer(10); 
Integer j = new Integer(10); 

...あなたはキャッシングを避け、結果はあなたが期待したものになります。整数の範囲にある整数値を保持

+0

@pst編集に感謝します。私の裸での入力は少し厄介です。 – user949300

1
この場合ここ

Integer iInteger jIntegerの範囲は-128 to 128あり、Integer nInteger mInteger

関連する問題