【发布时间】:2012-08-14 17:58:35
【问题描述】:
我想在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 值存储在 Perm 空间中的 [-128, 127] 中,并将它们的地址提供给 Longs 以及上述范围之外的所有内容,它会创建一个新的代码中遇到的每个静态值的分配。
我接近正确了吗?在什么情况下我们必须注意类似的行为?
PS。我知道我应该使用nullcheck 然后.equals() 来比较对象,但我很好奇是否有人知道答案。
编辑
在 jtahlborn 的回答谁给了我关键字 auto-boxing 之后,我发现这篇很棒的文章带有 well-documented answer
【问题讨论】:
-
是的,你是对的。 (是的,在这里使用
==而不是.equals是一种罪过。) -
您不应该使用空检查。空检查是邪恶的。只是不要使用 NULL。