7

私は次のコードを実行していましたが、いくつかの驚くべき結果が得られました

class Test {
    public static void main(String[] args) {
       Short i = 122, j = 122;
       if (i == j) {
            System.out.println("true");
       } else {
        System.out.println("false");
      }
    }
 }

 class Test {
    public static void main(String[] args) {
       Short i = 1222, j = 1222;
       if (i == j) {
            System.out.println("true");
       } else {
        System.out.println("false");
      }
    }
 }

これらのコードを実行すると、最初のコードがtrue出力を提供し、2番目のコードがfalse出力を提供しています。それを使用してオブジェクトを比較するとき==、実際の値を探すのではなく、参照を比較するだけです。しかし、最初のケースでは値を比較していますが、2 番目のコードではそうではありません。

4

1 に答える 1

11

Shortには -128 ~ 127 の範囲の値の内部キャッシュがあります。したがって、この範囲内の数値については、 の同じインスタンスShortが返されます。== を使用して比較すると、Java はインスタンスで比較するため、 を返しますtrue。数値がこの範囲外の場合、2 つの異なるインスタンスが作成されます。したがって、この==比較は失敗し、 が返されfalseます。

このキャッシュを使用することで、メモリを節約し、コードを高速化できます。

JDK 1.7 ソース コードから次のメソッドを調べます。これは1.5からありました

public static Short valueOf(short s) {
        final int offset = 128;
        int sAsInt = s;
        if (sAsInt >= -128 && sAsInt <= 127) { // must cache
                return ShortCache.cache[sAsInt + offset];
        }
        return new Short(s);
    }

このキャッシングは、他のラッパー クラスにもあります。詳細については、Java のドキュメントを参照してください。

于 2013-09-20T02:01:23.563 に答える