1

重複の可能性:
Weird Java Boxing

public class example {
    public static void main(String[] args) {

        Integer a=127,b=127;
        if(a==b)
            System.out.println("Equal");
        else
            System.out.println("Not Equal");
        Integer c=128,d=128;
        if(c==d)
            System.out.println("Equal");
        else
            System.out.println("Not Equal");
    }

}

出力:

Equal
Not Equal
4

3 に答える 3

5

基本的に、-127 から 127 までの整数は、これらの数値を使用するときに常にメモリ内の同じ数値を参照するように「キャッシュ」されます。これが == が機能する理由です。

その範囲外の整数はキャッシュされないため、参照は同じではありません。

したがって、127 と 127 を比較しようとすると、作成されたオブジェクトは 1 つしかなく、正しく機能しましたが、128 で試行すると範囲外になり、2 つのオブジェクトが作成されたため、== 演算子を使用してそれらを比較することはできません。

この目的のために、.equals() (オブジェクト参照の比較 ) メソッドを使用します。詳細については、こちらを参照してください。

Integer c=128,d=128;
if(c.equals(d))
        System.out.println("Equal");
    else
        System.out.println("Not Equal");
于 2012-11-20T07:53:54.427 に答える
0

Integer.javaのソースコードから

private static class IntegerCache {

private IntegerCache(){}

static final Integer cache[] = new Integer[-(-128) + 127 + 1];

static {
    for(int i = 0; i < cache.length; i++)
    cache[i] = new Integer(i - 128);
}
}

/**
 * Returns a <tt>Integer</tt> instance representing the specified
 * <tt>int</tt> value.
 * If a new <tt>Integer</tt> 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.
 *
 * @param  i an <code>int</code> value.
 * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
 * @since  1.5
 */
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache 
    return IntegerCache.cache[i + offset];
}
    return new Integer(i);
}
于 2012-11-20T07:58:48.807 に答える
0

これは、Integer範囲 [-128, 127] 内の数値がヒープに格納されているために発生します。したがって、オブジェクト値ではなくオブジェクト参照を比較し、両方を比較してヒープ内の同じオブジェクトInteger a = 127Integer b = 127指すと、式が評価されtrueます。

値がその範囲外の場合Integer、2 つの異なるオブジェクトが取得されるため、参照比較が返されますfalse

于 2012-11-20T07:54:58.563 に答える