相等运算符如何处理原始数据和对象类型数据
how equal operator works with primitive and object type data
我知道这是一个非常基本的问题,但我想弄清楚这个概念。我想知道 ==
运算符在原始类型和对象类型的情况下如何工作。例如
Integer a = 1;
int b = 1;
System.out.println(a == b)
如何将 a
与 b
进行比较,而 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
的原因
我知道这是一个非常基本的问题,但我想弄清楚这个概念。我想知道 ==
运算符在原始类型和对象类型的情况下如何工作。例如
Integer a = 1;
int b = 1;
System.out.println(a == b)
如何将 a
与 b
进行比较,而 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