我想在Long
s 上测试 '==' 运算符,这就是我发现的:以下代码:
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的回答谁给了我关键字自动装箱之后,我发现这篇很棒的文章有详细的答案