8

次のコードを検討してください。

class test {
   public static void main(String[] args) {
      test inst_test = new test();
      int i1 = 2000;
      int i2 = 2000;
      int i3 = 2;
      int i4 = 2;
      Integer Ithree = new Integer(2); // 1
      Integer Ifour = new Integer(2); // 2
      System.out.println( Ithree == Ifour );
      inst_test.method( i3 , i4 );
      inst_test.method( i1 , i2 );
   }
   public void method( Integer i , Integer eye ) {
      System.out.println(i == eye );
   }
}

それは印刷します:

false
true
false

== 演算子は、2 つの参照が同じオブジェクトに対して機能しているかどうかのみをチェックしますfalseが、この場合はそうではありません。

次は頭を悩ませますtruefalseなぜ Java は同じであるのに異なるi3と見なすのでしょうか? どちらも Integer にラップされていますが、両方ともfalse と評価されるべきではありませんか? この矛盾には実際的な理由がありますか?i4i1i2

4

7 に答える 7

15

オブジェクトへのプリミティブのオートボクシング(method小さな値のキャッシュを使用するための呼び出しで使用されます。Java言語仕様セクション5.1.7から:

ボックス化されている値pがtrue、false、バイト、\u0000から\u007fの範囲の文字、または-128から127までの整数または短い数値の場合、r1とr2を任意の2つのボックス変換の結果とします。 pの。r1==r2の場合は常にそうです。

その直後のスペックのディスカッション部分も面白いです。特に、JVMは、必要に応じてより多くの値をキャッシュできます。次のことを行った結果を確認することはできません。

Integer i1 = 129;
Integer i2 = 129;
boolean b = (i1 == i2);
于 2009-07-18T22:58:32.127 に答える
7

オートボクシングの場合、-128 から 127 までの整数がキャッシュされ、同じラッパー オブジェクトが返されます。\u0000 と \u007F の間のブール値と char 値と同じ

これはほとんどの場合得られるものですが、JVM の実装によって異なります。

于 2009-07-18T22:57:48.587 に答える
2

これは、ボクシングが特定の値 (128 だと思います) 未満の整数を事前に構築されたオブジェクトを参照し、より高い値を新しいオブジェクトに参照させるためです。

于 2009-07-18T22:55:30.700 に答える
1

オートボクシングは、new Integer(i) ではなくInteger.valueOf(i)を使用して、クラス Integer のオブジェクトを構築します。

他の人が言ったように、 valueOf() は主にスペース効率のためにキャッシュを使用します。

参照型に == を使用しないでください。ほとんどの場合、間違いです。

于 2009-07-19T06:55:40.890 に答える
0

ラッピングは整数オブジェクトの数を最小限に抑えようとし、メモリを節約するために2つを表すオブジェクトを1つだけ作成すると思います。

何が起こるかわからないオブジェクトで==を使用しないことを忘れないでください。

于 2009-07-18T22:57:51.350 に答える
0

整数クラスには、頻繁に使用されるインスタンスのキャッシュが含まれています。値の範囲は通常、JVMごとに異なります(構成可能な場合もあります)が、一般に、関連するコードは次のようになります。

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

(sun JDK 1.6からのコード)

これは、メモリを節約し、参照を使用して同等性をテストできるため、文字列インターンのようなものです(たとえば、 equalsの代わりに==

于 2009-07-18T23:00:10.237 に答える
0

オートボクシングは、いくつかのキャッシュ メカニズムを使用します。通常、 に依存するべきではなく==、常にequals等値をチェックするために使用します。

于 2010-01-28T11:23:31.153 に答える