2012-08-14 199 views
6

我想考“==”操作上Long S和这是我发现:下面的代码:这种奇怪的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将[-128, 127]中的所有long值存储在Perm空间中,并将它们的地址提供给Longs,并且将上述范围外的所有内容都存储在代码中为每个静态值创建的新分配。

我接近了吗?在什么情况下我们必须意识到类似的行为?

PS。我知道我应该使用null检查,然后.equals()来比较对象,但我很好奇,如果有人知道答案。

编辑

jtahlborn的回答谁给我的关键字自动装箱我发现与well-documented answer

+5

是的,你是对的。 (是的,在这里使用'=='而不是'.equals'是一种罪行。) – 2012-08-14 18:00:50

+1

http://stackoverflow.com/questions/11955958/with-abstract-datatypes-different-results-for-the-same-条件/ 11955984#11955984 – kosa 2012-08-14 18:06:22

+0

您不应该使用空检查。零检查是邪恶的。只是不要使用NULL。 – 2013-11-10 07:57:29

回答

1

-128 to +127将被评估为真使用==运营商,如果你是comparing object references。 Long值(从-128到+127)放入缓存中并多次返回,而较高和较低的数字每次都会生成new Long

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

+1

下来选民需要说明! – 2012-08-14 18:03:51

+1

我不是downvoter,但我觉得它需要什么样的外籍人士如何-128 t0 127将是真实的? – kosa 2012-08-14 18:10:28

+0

down投票答案更新.. – 2012-08-14 18:23:26

3

Long具有用于从值-128到127一个内部高速缓存,如果你创建Long通过Long.valueOf(long)方法或在此区间自动装箱你总是收到相同的对象为等于值。这就是为什么'=='适用于你的例子中的0,127和-128的原因。

如果您在[-128,127]之外创建了Long,则始终将创建新实例(如果是Long对象)。 这就是为什么'=='不适用于128和-129。

看看Long.valueOf(long)的源代码。

相关问题