web-dev-qa-db-ja.com

Javaで整数ラッパーを比較する場合、128 == 128はfalseですが、127 == 127はtrueになるのはなぜですか?

class D {
    public static void main(String args[]) {
        Integer b2=128;
        Integer b3=128;
        System.out.println(b2==b3);
    }
}

出力:

false

class D {
    public static void main(String args[]) {
        Integer b2=127;
        Integer b3=127;
        System.out.println(b2==b3);
    }
}

出力:

true

注:-128〜127の数値は真です。

155
vipin k.

Java)で数値リテラルをコンパイルし、それを整数(大文字I)に割り当てると、コンパイラーは以下を出力します。

_Integer b2 =Integer.valueOf(127)
_

このコード行は、オートボクシングを使用するときにも生成されます。

valueOfは、特定の数値が「プール」されるように実装され、128より小さい値に対して同じインスタンスを返します。

Java 1.6ソースコード、621行目から:

_public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}
_

highの値は、システムプロパティを使用して別の値に設定できます。

-Djava.lang.Integer.IntegerCache.high = 999

そのシステムプロパティでプログラムを実行すると、trueが出力されます。

明らかな結論:同一の2つの参照に依存せず、常に.equals()メソッドと比較してください。

したがって、b2.equals(b3)は、b2、b3のすべての論理的に等しい値に対してtrueを出力します。

Integerキャッシュはパフォーマンス上の理由ではなく、 JLS、セクション5.1.7 ;に準拠することに注意してください。 -128から127までの値にはオブジェクトIDを指定する必要があります。

Integer#valueOf(int) もこの動作を文書化しています:

このメソッドは、頻繁に要求される値をキャッシュすることで、スペースと時間のパフォーマンスを大幅に向上させる可能性があります。このメソッドは、常に-128〜127の範囲の値をキャッシュし、この範囲外の他の値をキャッシュする場合があります。

202

オートボクシングキャッシュ-128〜127。これはJLSで指定されます( 5.1.7 )。

ボックス化された値pが真、偽、バイト、\ u0000から\までの範囲の文字の場合u007f、または-128〜127のintまたはshort番号。その後、r1とr2を、pの2つのボクシング変換の結果とします。常にr1 == r2。である

オブジェクトを扱うときに覚えておくべき簡単なルールは-.equals 2つのオブジェクトが「等しい」かどうかを確認する場合は、==それらが同じインスタンスを指しているかどうかを見たいとき。

21

プリミティブデータ型であるintを使用すると、両方の場合に期待どおりの出力が得られます。

ただし、Integerオブジェクトを使用しているため、==演算子の意味は異なります。

オブジェクトのコンテキストでは、==は変数が同じオブジェクト参照を参照しているかどうかを確認します。

オブジェクトの値を比較するには、equals()メソッドを使用する必要があります。

 b2.equals(b1)

b2がb1より小さいか、大きいか、等しいかを示します(詳細についてはAPIを確認してください)

8
chrisbunney

Java関連。

メモリを節約するために、Javaは、値が以下の範囲に入るすべてのラッパーオブジェクトを「再利用」します:

すべてのブール値(trueおよびfalse)

すべてのバイト値

\ u0000から\ u007fまでのすべての文字値(10進数で0から127)

-128〜127のすべてのShortおよびInteger値。

7
display_name

Integer.Javaをご覧ください。値が-128〜127の場合、キャッシュされたプールを使用するため、(Integer) 1 == (Integer) 1 while (Integer) 222 != (Integer) 222

 /**
 * Returns an {@code Integer} instance representing the specified
 * {@code int} value.  If a new {@code Integer} instance is not
 * required, this method should generally be used in preference to
 * the constructor {@link #Integer(int)}, as this method is likely
 * to yield significantly better space and time performance by
 * caching frequently requested values.
 *
 * This method will always cache values in the range -128 to 127,
 * inclusive, and may cache other values outside of this range.
 *
 * @param  i an {@code int} value.
 * @return an {@code Integer} instance representing {@code i}.
 * @since  1.5
 */
public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}       
3
yanghaogn