public class Test {
public static void main(String[] args) {
Integer t = 1;
int s = 1;
System.out.println(s != t); // (*)
}
}
问题:编译器对字符串做了(*)什么?我不明白是拆包t还是打包s……
一个智者写道,“自动装箱”正在这里进行,但我无法联系到他,我不知道他为什么这样写。
我只能假设,既然在比较中我们找到了它Object some_obj是什么Integer t,那么就会有一个引用比较,并且int s它是自动打包的。
从程序的结果来看:t==s- 是的。我不知道为什么会这样......似乎是因为有一些方法 forInteger和String其他类似的方法将对象带到某种形式,用相同性质的对象替换引用,以便它==工作。比如两个“不同”的字符串,例如:"Hello"和"Hello"调用此方法后进行比较==给true.
总计:我真的很想看到某种文档解释正在发生的事情,正在发生的事情,以及为什么该行的结果(*)是false,这基本上意味着:t并且s是平等的。但在什么意义上他们是平等的?链接,数字?...字节码对我没有帮助,无法理解这种比较是如何进行的。
发生拆包
t(即从Integerto转换int),然后是通常的基元比较(即 type 的值int)。要了解为什么会发生这种情况,让我们转向Java 规范。
==和运算符的说明!=,JLS 15.21.1:在比较的情况下
int,Integer类型操作数int是原始类型,类型操作数Integer可以转换为数值类型。原则上,如何转换二进制数字提升并不重要,重要的是执行JLS 5.6.2的相应部分中描述的操作:在我们的例子中,它是解包的
Integer,结果是int.int接下来,以通常的方式比较两个基元(类型的值)。很容易通过实验验证。
通过使用缓存:https ://ideone.com/sEhpKz
通过空拆箱异常:https ://ideone.com/ltbefI
在这两种情况下,它都会输出: