私はLong
秒で「==」演算子をテストしたいと、これは私が見つけたものです:次のコード:この奇妙なJavaの動作の原因は何ですか?
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
の値をPerm空間の[-128, 127]
に格納し、そのアドレスをLong
に指定し、上記の範囲外のものはすべて、コード内の各静的値に対して新しい割り当てを作成します。
私は右に近いですか?どのような状況で同様の行動に気づく必要がありますか?
PS。私はnull
のチェックをしてから.equals()
を使ってオブジェクトを比較すべきだと知っていますが、誰かが答えを知っていれば私は不思議でした。
EDIT
私にキーワードオートボクシングを与えたjtahlbornの答えの後、私はこれは、オートボクシングの結果であるwell-documented answer
はい、正しくあります。 (そして、はい。 '.equals'の代わりに' == 'を使うのは罪です。) –
http://stackoverflow.com/questions/11955958/with-abstract-datatypes-different-results-for-the-same-条件の種類/ 11955984#11955984 – kosa
ヌルチェックを使用しないでください。ヌルチェックは悪です。ちょうどNULLを使用しないでください。 –