“==”如何作用于原始类型

How "==" works on primitive types

我想知道“==”运算符如何处理原始值。我知道“==”检查两个引用是否指向堆上的同一个对象。 但是它如何在存储在堆栈中的原始值的上下文中工作? 例如

int a = 5; int b = 5;

我假设这些值没有存储在内存中的同一个地方,但是 a == b returns "true".

我的假设是 JVM 将存储在堆栈中的所有值视为存储在内存中的一个位置,并且 returns 在“==”的情况下为真。 你能更详细地解释一下这件事吗?

此致

你的假设是错误的。比较原语时,没有内存地址在起作用。这是一个比较一个值是否等于另一个值的简单指令,在字节码中实现为比较(寄存器值)和条件跳转。

编辑:正如 James 和 Varun 所指出的,我的原始答案不适用于 OP 的示例,因为对象引用是一个数值,就像一个整数。所以在这种情况下比较操作实际上是相同的。


在其他语言中,有一种叫做运算符重载的东西。 Java 不支持用户运算符重载,但了解这些运算符的工作原理将使您更好地了解同一个运算符如何根据上下文使用不同的逻辑。

当您比较变量和基元时,生成的机器代码执行的比较操作与比较两个对象时不同。使用相同的语法是因为比较的想法在逻辑上足够相似以保证使用相同的运算符符号而不是为两种不同的功能定义完全不同的符号。

对于任何比较操作,JVM 都会查找操作数的数据类型。根据不同的操作数类型 Java 字节码指令用于比较。

JVM 适用于两种数据类型。

根据JVM 7 specification

Like the Java programming language, the Java Virtual Machine operates on two kinds of types: primitive types and reference types. There are, correspondingly, two kinds of values that can be stored in variables, passed as arguments, returned by methods, and operated upon: primitive values and reference values.

引用也是 reference.

类型的值

The Java Virtual Machine contains explicit support for objects. An object is either a dynamically allocated class instance or an array. A reference to an object is considered to have Java Virtual Machine type reference. Values of type reference can be thought of as pointers to objects. More than one reference to an object may exist. Objects are always operated on, passed, and tested via values of type reference.

对于基本类型和引用类型的算术运算,JVM 使用操作码来指定参数的数据类型以及操作。

例如, lcmp - 比较两个长值

最后,对于 JVM,任何算术运算都是给定操作数的字节算术。