等于运算符如何处理原始和对象类型数据

Sti*_*ing 12 java unboxing equality

我知道这是一个非常基本的问题,但我想明确这个概念.我想知道==运算符在原始类型和对象类型的情况下如何工作.例如

Integer a = 1;
int b = 1;
System.out.println(a == b)
Run Code Online (Sandbox Code Playgroud)

如何a与之比较b,而a包含包含值1的对象的引用.有人可以向我清楚它是如何在内部工作的吗?

akh*_*ess 16

通常,Java中的相等运算符执行所谓的浅比较.换句话说,它比较变量包含的值.现在,原始数据类型的变量包含值本身,而引用类型包含对存储实际内容的堆区域的引用.这意味着,在您的代码段int b将持有价值1Integer a将举行堆上的实际Integer对象的内存地址.

现在,在您提供的特定示例中,有一个特征.Integer类是一个包装原始整数类型的特殊包装类.编译器可以自动在这些包装器对象和原始类型(称为装箱和拆箱)之间进行转换.

让我们一步一步地告诉您代码清楚.

Integer a = 1;
Run Code Online (Sandbox Code Playgroud)

编译器实际上替换了以下代码:

Integer a = Integer.valueOf(1);
Run Code Online (Sandbox Code Playgroud)

static方法valueOf返回一个包装器对象实例,该实例包装提供的原始值.当编译器从基本类型构造包装类时,此过程称为装箱.

当使用这样的包装器对象时,使用相等运算符将其与原始变量进行比较

a == b
Run Code Online (Sandbox Code Playgroud)

编译器实际上将其更改为以下内容:

a.intValue() == b;
Run Code Online (Sandbox Code Playgroud)

其中intValue返回包装器对象包装的原始值(称为拆箱),即它将原始值解包并使表达式等效于比较两个基元.这就是等于运算符然后返回的原因true


Ser*_*auk 5

在您的特定示例中,盒装类型Integer将被解包为基本类型int ==并将比较基元(即在您的情况下为true).