3

重複の可能性:
このコードで 128==128 が false を返し、127==127 が true を返すのはなぜですか?

以下の Java コードは true を返します

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

Javaで文字列リテラル定数プールの概念を持っている方法は、Javaのラッパークラスの場合にも同様の概念を持っていますか?

4

3 に答える 3

8

Javaには小さな整数用の整数プールも-128 to 127あるため、文字列定数プールと同様に整数に対しても同じように動作します

以下のコードがIntegerクラスにあります

private static class IntegerCache {
    static final int high;
    static final Integer cache[];

    static {
        final int low = -128;

        // high value may be configured by property
        int h = 127;
        if (integerCacheHighPropValue != null) {
            // Use Long.decode here to avoid invoking methods that
            // require Integer's autoboxing cache to be initialized
            int i = Long.decode(integerCacheHighPropValue).intValue();
            i = Math.max(i, 127);
            // Maximum array size is Integer.MAX_VALUE
            h = Math.min(i, Integer.MAX_VALUE - -low);
        }
        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);
    }

    private IntegerCache() {}
}

また、毒による以下の回答で述べられているように:

第5章 コンバージョンとプロモーション

ボックス化された値 p が true、false、\u0000 から \u007f までの範囲のバイト、または char、または -128 から 127 (両端を含む) までの int または short の数値である場合、r1 および r2 を次の結果とします。 p の任意の 2 つのボクシング変換。r1 == r2 は常にそうです。

于 2012-09-06T19:16:17.677 に答える
2

オブジェクトのプールは、VM やランタイム環境の成果物です。それらはパフォーマンス上の理由から存在する可能性がありますが、絶対に依存しないでください。.equals() を使用します。

JLS はボクシングの動作を指定します。コメントで指摘されたように、これは Integer クラス自体に部分的に実装されています。ただし、もう 1 つの興味深い点は、このプールのサイズも VM 引数によって調整できることです。Integer.java から:

585       /**
586        * Cache to support the object identity semantics of autoboxing for values between
587        * -128 and 127 (inclusive) as required by JLS.
588        *
589        * The cache is initialized on first usage.  The size of the cache
590        * may be controlled by the -XX:AutoBoxCacheMax=<size> option.
591        * During VM initialization, java.lang.Integer.IntegerCache.high property
592        * may be set and saved in the private system properties in the
593        * sun.misc.VM class.
594        */
于 2012-09-06T19:17:04.140 に答える
1

[5.1.7. ボクシング変換] http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

ボックス化される値 p は、true、false、バイト、\u0000 ~ \u007f の範囲の char、または -128 ~ 127 (両端を含む) の int または short の数値であり、r1 および r2 を任意の結果とします。 pの2つのボクシング変換。r1 == r2 は常にそうです。

しかし、一般的にこれに依存するのはばかげています。最初に数値がキャッシュされた範囲内にあるかどうかを確認してから、条件付きで == または equals() を使用する必要があるからです。プリミティブ型、Class および enum には == を使用し、その他すべてには equals を使用します。

于 2012-09-06T19:22:43.020 に答える