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

2022-09-03 05:13:03

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

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

how 与 进行比较,而包含包含值 1 的对象的引用。有人可以向我澄清它的内部工作原理吗?aba


答案 1

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

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

让我们一步一步地引导您编写代码,以使其清晰明了。

Integer a = 1;

编译器实际上替换了以下代码而不是此行:

Integer a = Integer.valueOf(1);

静态方法返回包装提供的基元值的包装器对象实例。编译器从基元类型构造包装类时,此过程称为 boxing。valueOf

使用这种包装器时,使用相等运算符将对象与基元变量进行比较

a == b

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

a.intValue() == b;

其中返回由包装器对象包装的基元值(称为取消装箱),即它取消装箱基元值并使表达式等效于比较两个基元。这就是相等运算符返回的原因intValuetrue


答案 2

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