后增量后==的令人费解的行为

时间:2013-02-25 10:25:13

标签: java post-increment

有人在一些论坛帖子中假设许多人甚至是经验丰富的Java开发人员都不会理解以下Java代码的和平。

Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1++ == i2++);
System.out.println(i1 == i2);

作为一个对Java感兴趣的人,我给了我一些想法并得出了以下结果。

System.out.println(i1++ == i2++);
// True, since we first check for equality and increment both variables afterwards.

System.out.println(i1 == i2);
// True again, since both variables are already incremented and have the value 128

Eclipse告诉我不然。第一行是真的,第二行是假的。

我真的很感激解释。

第二个问题。这个Java是特定的还是这个例子也适用于基于C的语言?

2 个答案:

答案 0 :(得分:14)

Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1++ == i2++); 
// here i1 and i2 are still 127 as you expected thus true
System.out.println(i1 == i2); 
// here i1 and i2 are 128 which are equal but not cached
    (caching range is -128 to 127), 

如果您使用equals(),则情况2将返回true作为整数的==运算符仅适用于缓存值。当128超出缓存范围时,128以上的值将不会被缓存,因此您必须使用equals()方法检查127以上的两个整数实例是否

<强> TEST:

Integer i1 = 126;
    Integer i2 = 126;
    System.out.println(i1++ == i2++);// true
    System.out.println(i1 == i2); //true



 Integer i1 = 126;
        Integer i2 = 126;
        System.out.println(i1++ == i2++);// true
        System.out.println(i1.equals(i2)); //true

  Integer i1 = 128;
        Integer i2 = 128;
        System.out.println(i1++ == i2++);// false
        System.out.println(i1==i2); //false

  Integer i1 = 128;
        Integer i2 = 128;
        System.out.println(i1++.equals(i2++));// true
        System.out.println(i1.equals(i2)); //true

答案 1 :(得分:1)

正如所解释的那样,这归因于Integer caching。为了好玩,您可以使用以下JVM选项运行程序:

-XX:AutoBoxCacheMax=128

并且它将打印两次true(主机7上可用的选项 - 不一定在其他JVM上)。

请注意:

  • 这是特定于JVM的
  • 修改后的行为符合JLS,该JLS表示必须缓存-128和+127 之间的所有值,但也表示可以缓存其他值 。< / LI>

底线:第二个print语句在Java 中是未定义的,可以根据所使用的JVM实现和/或JVM选项打印true或false。