2011-08-02 8 views
3

可能性の重複:
Wrapper class and == operatorJavaラッパー・クラスが平等オブジェクト - 奇妙な行動

をラッパークラスのオブジェクト等価演算子は、包まれた値がであるかどうかに応じて異なる結果を生成しているかのように思えますバイト範囲かどうかを判断する。ここでは、この動作を実証するためのコードスニペットです:

smaller than byte 

same 

larger than byte 

not same 

注:

System.out.println("smaller than byte"); 

Integer i1 = 1; 

Integer i2 = 1; 

if (i1 == i2) System.out.println("same"); 

if (i1 != i2) System.out.println("not same"); 

System.out.println("larger than byte"); 

Integer i3 = 128; 

Integer i4 = 128; 

if (i3 == i4) System.out.println("same"); 

if (i3 != i4) System.out.println("not same"); 

は、次の出力が生成され、私は、Linux上で(1.6.0_24-B07を構築)のHotSpotでこの出力を得ました。 LongとおそらくShortについても同じことが起こります(それはテストされていません)。

注:Linux上の他のHotSpotビルドでも同じ出力 誰でも説明できますか?


小編集、ちょうどそれが少しより面白くするために:

エンドで

if (i3 <= i4 && i3 >= i4) System.out.println("same after all..."); 

の追加、版画 "same after all..."。

答えて

4

これは間違いありません。 JVMは小さな値を自動保護するときに "キャッシュ"してIntegerインスタンスを再利用します。

参照Java言語仕様Section 5.1.7 Boxing Conversion

pが箱詰めされた値はtruefalse、バイト、\u007f範囲\u0000でチャー、または-128との間のintまたは短い番号である場合そして127とすると、pの任意の2つのボクシング変換の結果をr1とr2とする。常にr1 == r2の場合です。 Integer<><=を使用してSおよび>=を比較すると値が!===とは対照的にアンボックス化さ

+0

ありがとうございます - 私は現在SCJPのために学んでおり、公式の学習ガイドにも同様の例があります。この動作について著者が説明する説明は異なっています(明らかに間違っています)。 – maciek

+0

@maciek:本当ですか?あなたが間違っていると思っているソースや短い抜粋を伝えてください。 –

+0

まあ、私は十分に注意深く読んでいないようです。実際にはこの文章では、この動作がShortとIntegerに-128と127の間にしか適用されないことが実際に述べられています。私の失敗 – maciek

2

-127と127の間の整​​数は「キャッシュ」されているので、同じ参照を返します。つまり、i1とi2は同じオブジェクトを指しています。

+0

残念な範囲は-128〜127です – Aniruddha