我知道这是一个非常基本的问题,但我想清楚这个概念。我想知道==
运算符在原始类型和对象类型的情况下如何工作。例如
Integer a = 1;
int b = 1;
System.out.println(a == b)
a
如何与b
进行比较,而a
包含包含值1的对象的引用。有人可以向我清楚它是如何在内部工作的吗?
答案 0 :(得分:15)
通常,Java中的相等运算符执行所谓的浅比较。换句话说,它比较变量包含的值。现在,原始数据类型的变量包含值本身,而引用类型包含对存储实际内容的堆区域的引用。这意味着在您的代码段int b
中将保存值1
,而Integer a
将保留堆上实际Integer对象的内存地址。
现在在你提供的特定例子中,有一个特征。 Integer类是一个包装原始整数类型的特殊包装类。编译器可以自动在这些包装器对象和原始类型(称为装箱和拆箱)之间进行转换。
让我们一步步走你的代码,明确表示。
Integer a = 1;
编译器实际上替换了以下代码的代码:
Integer a = Integer.valueOf(1);
静态方法valueOf
返回一个包装器对象实例,它包装提供的原始值。当编译器从基本类型构造包装类时,此过程称为装箱。
当使用这样的包装器对象时,使用相等运算符
与基本变量进行比较a == b
编译器实际上将其更改为以下内容:
a.intValue() == b;
其中intValue
返回由包装器对象包装的原始值(称为拆箱),即它将原始值取消装箱并使表达式等效于比较两个基元。这就是等于运算符然后返回true
答案 1 :(得分:5)
在您的特定示例中,盒装类型Integer将被取消装入基本类型int,而==
将比较基元(例如,在您的情况下为true)。