6

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 空間内に格納し、それらのアドレスをLongs に与え、上記の範囲外のすべてに、コード内で一致する静的な値ごとに新しい割り当てを作成するというものでした。

私は正しいことに近づいていますか?どのような状況で、同様の行動に注意する必要がありますか?

PS。nullチェックを使用して.equals()からオブジェクトを比較する必要があることはわかっていますが、誰かが答えを知っているかどうか知りたいです。

編集

オートボクシングというキーワードを与えてくれたjtahlbornの回答の後、十分に文書化された回答を含むこの素晴らしい記事を見つけました

4

3 に答える 3

6

これはオートボクシングの結果です。Long.valueOf()を参照してください。

于 2012-08-14T17:59:45.987 に答える
3

Long-128 から 127 までの値の内部キャッシュがあります。この間隔でメソッドまたはオートボクシングLongによって作成するLong.valueOf(long)と、等しい値に対して常に同じオブジェクトを受け取ります。そのため、例では '==' が 0、127、および -128 で機能します。

[-128, 127] の外側で作成すると、オブジェクトのLong場合は常に新しいインスタンスが作成されLongます。そのため、'==' は 128 と -129 では機能しません。

Long.valueOf(long)ソースコードを見てください。

于 2012-08-14T18:08:04.707 に答える
1

-128 to +127==の場合、演算子を使用して true と評価されますcomparing object references。Long 値 (-128 から +127 まで) はキャッシュに入れられ、複数回返されますが、そのたびに高い数値と低い数値が生成されnew Longます。

これはプリミティブ ラッパー クラスにも当てはまりInteger, Floatます。Integer と Float で試してみてください。

于 2012-08-14T18:00:08.877 に答える