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

时间:2015-03-19 07:37:42

标签: java equality unboxing

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

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

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

2 个答案:

答案 0 :(得分:15)

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

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

让我们一步步走你的代码,明确表示。

Integer a = 1;

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

Integer a = Integer.valueOf(1);

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

当使用这样的包装器对象时,使用相等运算符

与基本变量进行比较
a == b

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

a.intValue() == b;

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

的原因

答案 1 :(得分:5)

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