5

重複の可能性:
整数ラッパーオブジェクトは、値127内でのみ同じインスタンスを共有しますか?
!=および==演算子はJavaの整数でどのように機能しますか?

2つのintを次のケースと比較しようとしましたが、予期しない結果が得られました

  1. 次のようにすると、@@@が印刷​​されました。

     class C {
       static Integer a = 127;
       static Integer b = 127;
       public static void main(String args[]){
       if(a==b){
          System.out.println("@@@"); 
       }
       }
     }
    
  2. 次のようにしたとき、@@@は印刷されませんでした。

     class C {
       static Integer a = 145;
       static Integer b = 145;
       public static void main(String args[]){
       if(a==b){
          System.out.println("@@@"); 
       }
       }
     }
    

誰かが理由を教えてもらえますか?

4

4 に答える 4

7

オブジェクトのIDを比較しています。128未満の値の場合、Integerクラスはそのオブジェクトをキャッシュします。そのため、最初の例では同じです。もう1つの例は、キャッシュされない高い値を使用する場合です。

@niklonが指摘したように、キャッシングには-128の下限もあります。

上枠はVMargで調整できます-Djava.lang.Integer.IntegerCache.high=4711

Peterの興味深いブログ投稿をさらに読む:http: //vanillajava.blogspot.co.uk/2012/01/surprising-results-of-autoboxing.html

于 2012-08-30T21:11:30.440 に答える
5

sを比較しているのではなくint、参照が等しいかどうかオブジェクトを比較しています。を使用するか、の代わりに.equalstypeを使用します。intObject

于 2012-08-30T21:09:53.557 に答える
1

ここでは、プリミティブIntegerではなくオブジェクトを使用しています。したがって、ではなくint、と2つのインスタンスを比較する必要があります。代わりにプリミティブ型を使用した場合は、を使用します。.equals(...)====

オブジェクトを処理するときは、実際の値ではなく、2つのオブジェクトの参照==を比較するため、一見奇妙な結果が返される場合があることに注意してください。

于 2012-08-30T21:10:14.780 に答える
1

ObjectクラスのサブクラスであるObjectを比較するために使用し、使用if(a.equals(b))しないでください。==

==演算子は、int、longなどのプリミティブ型専用です。

于 2012-08-30T21:12:05.770 に答える