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