6

我想在Longs 上测试 '==' 运算符,这就是我发现的:以下代码:

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==如果您是,将使用运算符评估为真comparing object references。Long 值(从 -128 到 +127)被放入缓存并多次返回,而new Long每次都会生成更高和更低的数字。

这也适用于原始包装类Integer, Float。试试整数和浮点数。

于 2012-08-14T18:00:08.877 回答