2017-09-01 52 views
3

数値比較演算子を使用してJavaの2つのIntegerオブジェクトを比較するとき、以下のコードの動作を理解しようとしています。上記のコードのJava autoboxingと演算子を使用したオブジェクトの比較

Integer i1 = new Integer(1); 
    Integer i2 = new Integer(1); 
    System.out.println(i1 == i2); 
    System.out.println(i1 > i2); 
    System.out.println(i1 >= i2); 

出力は次のとおりです。

false 
false 
true 

は、私は(それが偽与えThatsなぜに作られたオブジェクトインスタンスの比較)第一の場合には何が起こっているのか理解しています。しかし、第2と第3のシナリオが異なる理由と、それがどうして正確に機能するのでしょうか?

+0

あなたの結果は混乱しています。私は「整数」が-128〜127の範囲でJLSがキャッシュされ、同じオブジェクトに必要と思った。 https://stackoverflow.com/questions/20897020/why-integer-class-caching-values-in-the-range-128-to-127 – markspace

+0

@markspace autoboxingまたは 'valueOf()'を呼び出すときだけです。 'new'キーワードで作成されたオブジェクトは、常に異なるものでなければなりません。 – shmosel

+0

@shmoselああ、そうだよ!私がリンクしているSOの質問は、 "boxed"オブジェクトです。それを指摘してくれてありがとう。 – markspace

答えて

4

<,>,>=およびが数値比較であるため、コンパイラはアンボックスを行う必要があることを認識しています。

ただし、==および!=は、常に非プリミティブ型の参照コンパレータとして機能します。

+0

<, <=, >では2進数値昇格(数値への変換)が、[JLS 15.20.1](https://docs.oracle.com/javase/specs/jls/se8/html/)で指定されているように> =オペランドで実行されます。 jls-15.html#jls-15.20.1)) (第2および第3シナリオの場合)しかし、!=と==の場合、少なくとも1つのオペランドが昇格のために数値型でなければなりません。 – ayushi

関連する問題