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

how equal operator works with primitive and object type data

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

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

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

在您的特定示例中,装箱类型 Integer 将被取消装箱为原始类型 int 并且 == 将比较原始类型(即在您的情况下为 true)。

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

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

让我们一步步教你写代码,让你说清楚。

Integer a = 1;

编译器实际上替换了这一行的以下代码:

Integer a = Integer.valueOf(1);

静态方法valueOf returns 包装提供的原始值的包装对象实例。当编译器从原始类型构造包装器 class 时,此过程称为装箱。

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

a == b

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

a.intValue() == b;

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

的原因