有人在一些论坛帖子中假设许多人甚至是经验丰富的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的语言?
答案 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上)。
请注意:
底线:第二个print语句在Java 中是未定义的,可以根据所使用的JVM实现和/或JVM选项打印true或false。