これは、整数キャッシングのためです。
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);
との両方が同じオブジェクトi
をj
指しています。値が 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
==
演算子は、実際のオブジェクト参照をチェックします。
equals()
オブジェクトの値 (内容) をチェックします。
コメントへの回答
あなたが持っている、
Integer i = Integer.valueOf(127);
ここで新しいオブジェクトが作成され、参照が割り当てられますi
Integer j = Integer.valueOf(127); //will not create new object as it already exists
整数キャッシュ (-128 から 127 までの数値) により、以前に作成されたオブジェクト参照が に割り当てられj
、次にi
とj
同じオブジェクトを指します。
今考えます、
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
ます。どちらも異なる参照であり、異なる値を持っているためです。