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

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

 Integer a = 1; int b = 1; System.out.println(a == b) 

如何将ab进行比较,而a包含包含值1的对象的引用。有人可以向我清楚它是如何在内部工作的吗?

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

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

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

 Integer a = 1; 

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

 Integer a = Integer.valueOf(1); 

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

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

 a == b 

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

 a.intValue() == b; 

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

在您的特定示例中,盒装类型Integer将被拆箱到基本类型int,而==将比较基元(在您的情况下为true)。