9

有人在某个论坛帖子中假设,许多人甚至是经验丰富的 Java 开发人员都不会理解 Java Code 的以下内容。

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 的语言?

4

2 回答 2

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), 

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

测试:

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
于 2013-02-25T10:27:16.370 回答
1

正如所解释的,这是由于整数缓存。为了好玩,您可以使用以下 JVM 选项运行程序:

-XX:AutoBoxCacheMax=128

它会打印两次 true(hostpot 7 上可用的选项 - 不一定在其他 JVM 上)。

注意:

  • 这是 JVM 特定的
  • 修改后的行为符合 JLS,它说必须缓存 -128 和 +127 之间的所有值,但也说可以缓存其他

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

于 2013-02-25T10:42:24.630 回答