当前位置: 首页 > 面试题库 >

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

傅玮
2023-03-14
问题内容

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

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

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


问题答案:

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

现在,在您提供的特定示例中,只有一种说法。整数类一个特殊的包装器类,用于包装原始整数类型。编译器可以在此类包装对象和原始类型之间自动转换(称为装箱和拆箱)。

让我们一步一步地使您的代码清晰明了。

Integer a = 1;

编译器实际上替换了此行插入的以下代码

Integer a = Integer.valueOf(1);

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

使用此类包装器对象时,使用相等运算符将其与原始变量进行比较

a == b

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

a.intValue() == b;

其中intValue返回由包装对象包装的原始值(称为拆箱),即,将原始值拆箱,并使表达式等效于比较两个原始。这就是为什么相等运算符随后返回的原因true



 类似资料:
  • 整型 1,浮点型 1.2,字符 'a',字符串 "abc",布尔型 true 和 单元类型 () 可以 用数字、文字或符号的字面意义表示出来。 数字可以加上前缀 0x、0o、0b 分别表示十六进制数、八进制数、二进制数。 为了改善数字的可读性,可以在数字类型之间加上下划线(_),比如: 1_000 等同于 1000, 0.000_001 等同于 0.000001。 我们需要告诉计算机使用到的数据类

  • 本文向大家介绍如何处理R中的错误“ $运算符对于原子向量无效”?,包括了如何处理R中的错误“ $运算符对于原子向量无效”?的使用技巧和注意事项,需要的朋友参考一下 发生此错误的原因是$运算符不是设计用来访问向量元素的。如果我们使用$运算符来访问向量元素,则R无法理解它并认为它是无效的,因此,对于使用$运算符的位置,我们必须非常小心。当我们给元素命名并开始考虑将它们视为数据框列时,就会发生这种情况,

  • 一、数据类型 1.1 类型支持 Scala 拥有下表所示的数据类型,其中 Byte、Short、Int、Long 和 Char 类型统称为整数类型,整数类型加上 Float 和 Double 统称为数值类型。Scala 数值类型的取值范围和 Java 对应类型的取值范围相同。 数据类型 描述 Byte 8 位有符号补码整数。数值区间为 -128 到 127 Short 16 位有符号补码整数。数值

  • 数据类型和运算符 数据存储的原理 进制:十进制,二进制,八进制,十六进制 进制转换 源码、反码、补码 源码、反码、补码的应用 关键字和标识符 常量和变量 运算符 声明和定义 什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。但注意,这个名字一旦和这块内存匹配起来(可以想象是这个名字嫁给了这块空间,没有要彩礼啊。^_

  • 本章讲解 Rust 中的类型相关基础知识、运算符相关知识、和字符串的基本知识。