2
class Demo{
public static void main(String[] args) {  
     Integer i = Integer.valueOf(127);  
     Integer j = Integer.valueOf(127);        

     System.out.println(i==j);  

     Integer k = Integer.valueOf(128);  
     Integer l = Integer.valueOf(128);        

     System.out.println(k==l);  
  }  
}

最初の print ステートメントは true を出力しますが、2 番目の print ステートメントは false を出力します。詳しく説明してください。

4

3 に答える 3

5

これは、整数キャッシングのためです。

Java言語仕様5.1.7より

If the value p being boxed is true, false, a byte, or a char in the range 
\u0000 to \u007f, or an int or short number between -128 and 127 (inclusive), 
then let r1 and r2 be the results of any two boxing conversions of p. 
It is always the case that r1 == r2.  

理想的には、指定されたプリミティブ値 p をボックス化すると、常に同一の参照が生成されます

Integer i = Integer.valueOf(127);  
Integer j = Integer.valueOf(127);   

との両方が同じオブジェクトij指しています。値が 127 未満であるため。

Integer k = Integer.valueOf(128);  
Integer l = Integer.valueOf(128);   

k&の両方が異なるオブジェクトlを指しています。値が 127 より大きいため、演算子 を使用してオブジェクト参照をチェックしているため、異なる結果が得られています。
==


アップデート

メソッドを使用equals()して同じ結果を得る ことができます

System.out.println(i.equals(j));//equals() compares the values of objects not references  
System.out.println(k.equals(l));//equals() compares the values of objects not references 

出力は

true
true  
  1. ==演算子は、実際のオブジェクト参照をチェックします。
  2. equals()オブジェクトの値 (内容) をチェックします。

コメントへの回答

あなたが持っている、

Integer i = Integer.valueOf(127); 

ここで新しいオブジェクトが作成され、参照が割り当てられますi

Integer j = Integer.valueOf(127); //will not create new object as it already exists 

整数キャッシュ (-128 から 127 までの数値) により、以前に作成されたオブジェクト参照が に割り当てられj、次にij同じオブジェクトを指します。

今考えます、

Integer p = Integer.valueOf(127); //create new object 
Integer q = Integer.valueOf(126); //this also creates new object as it does not exists  

==明らかに、演算子とequals()メソッドを使用した両方のチェックが結果になりfalseます。どちらも異なる参照であり、異なる値を持っているためです。

于 2013-10-19T09:37:00.600 に答える
4
   i==j

整数キャッシングによる とのtrue 間の値です。-128127

言語仕様から

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

   Integer i = Integer.valueOf(127);   // new object
   Integer j = Integer.valueOf(127);   //cached object reference 
   Integer k = Integer.valueOf(128);   // new object
   Integer l = Integer.valueOf(128);   // new object

したがってij値が 127 であるため、 と は同じ参照を指しています。

where askおよびl 差参照を指しているのは、それらの値のためです>127

この動作のドキュメントに記載されている理由があります。

特に小さなデバイスでは、パフォーマンスが過度に低下することなく、望ましい動作になります。メモリ制限の少ない実装では、

于 2013-10-19T09:38:45.120 に答える
0

valueOf は整数オブジェクトを返します。Integer は int のラッパー クラスです。あなたの場合、

Integer == Integer は実際のオブジェクト参照を比較し、int == int は値を比較します。

既に述べたように、値 -128 から 127 はキャッシュされるため、それらに対して同じオブジェクトが返されます。

その範囲外の場合、別のオブジェクトが作成されるため、参照が異なります。

両方のケースで同じ結果が必要な場合は、次の方法で修正します。

  • 型を int にする
  • 型を int または
  • .equals() を使用する
于 2013-10-19T09:45:44.593 に答える