s で'==' 演算子をテストしたかったLong
のですが、これが私が見つけたものです: 次のコード:
public static void main(final String[] args) {
final Long n = 0L;
final Long m = 0L;
System.out.println(n + " == " + m + " : " + (n == m));
final Long a = 127L;
final Long b = 127L;
System.out.println(a + " == " + b + " : " + (a == b));
final Long A = 128L;
final Long B = 128L;
System.out.println(A + " == " + B + " : " + (A == B));
final Long x = -128L;
final Long y = -128L;
System.out.println(x + " == " + y + " : " + (x == y));
final Long X = -129L;
final Long Y = -129L;
System.out.println(X + " == " + Y + " : " + (X == Y));
}
出力:
0 == 0 : true
127 == 127 : true
128 == 128 : false
-128 == -128 : true
-129 == -129 : false
私が思いついた唯一の説明は、JVM がすべてのlong
値を[-128, 127]
Perm 空間内に格納し、それらのアドレスをLong
s に与え、上記の範囲外のすべてに、コード内で一致する静的な値ごとに新しい割り当てを作成するというものでした。
私は正しいことに近づいていますか?どのような状況で、同様の行動に注意する必要がありますか?
PS。null
チェックを使用して.equals()
からオブジェクトを比較する必要があることはわかっていますが、誰かが答えを知っているかどうか知りたいです。
編集
オートボクシングというキーワードを与えてくれたjtahlbornの回答の後、十分に文書化された回答を含むこの素晴らしい記事を見つけました