为什么这个程序在第一次打印语句中是假的,在打印语句中是正确的。I和i1是两个不同的对象,所以第一个语句必须打印"true",这是预期的,但是第二个print语句打印"false“,这会造成混乱。
public static void main(String[] args) {
Integer i = new Integer(10);
Integer i1 = new Integer(10);
System.out.println(i == i1); //printing false
i++;
i1++;
System.out.println(i == i1);//printing true
} 发布于 2016-08-24 07:20:48
使用new关键字总是创建两个不同的实例。因此,以下内容始终是正确的:
new Integer(10) != new Integer(10)因此,第一行打印"false“。
然后:
i++;隐藏了拳击和拳击。它相当于:
i = Integer.valueOf(i.intValue() + 1);正如在Integer.valueOf中所描述的,从-128到127的值(至少)是缓存的:您正在为i++和i1++取回缓存的Integer.valueOf(11)实例,因此第二行打印"true“。
发布于 2016-08-24 07:27:08
在此:
Integer i = new Integer(10);
Integer i1 = new Integer(10);您请求动态分配两个Integer类类型的实例,这将为您提供两个不同的引用。如果将其更改为:
Integer i = 10;
Integer i1 = 10;然后I和i1的引用将相等,因为对于小值,包装器类使用缓存的对象。
这是:
i++;
i1++;在JLS中的:15.14.2.后缀增量算子++中解释:
在添加之前,对值1和变量的值执行二进制数值提升(§5.6.2)。如果有必要,可以通过缩小原语转换(§5.1.3) *和/或在存储变量之前将其转换为变量类型(§5.1.7)来缩小和。
另外,下面的一个注意事项很重要,说明在应用运算符之前,可能会发生取消装箱转换:
请注意,上面提到的二进制数值提升可能包括取消装箱转换(§5.1.8)和值集转换(§5.1.13)。如果有必要,将值集转换应用到和被存储在变量中之前。因此,这意味着它被装箱回包装器类型。
因此,在将运算符++应用于已分配的Integer实例的引用类型或for类之后,如果其值在装箱类型的正确范围内,则以盒式整数结束。
发布于 2016-08-24 07:33:26
第一种是引用比较,因此得到假,第二种是值比较(在递增时,它不被装箱到原始int,因此增加到11,并再次自动装箱;i1也是如此)。第二个调用是(11 == 11),因此是真调用。
https://stackoverflow.com/questions/39116784
复制相似问题