2016-08-15 50 views
-1

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

int a = 5; int b = 5;

我认为这些值不存储在同一个地方的内存,但 一个== b返回“真”。

我的推测是JVM将存储在堆栈中的所有值存储在内存中的一个位置,并在“==”的情况下返回true。 你能否以更详细的方式向我解释这件事?

Regards

+0

你能清楚知道你到底想知道什么吗?你的问题非常模糊。 – 4castle

+0

它按价值比较它们。 – khelwood

+0

可能的重复:http://stackoverflow.com/questions/1586223/how-does-the-tostring-equals-object-methods-work-differently-or-similar –

回答

7

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

1

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


在其他语言中有一些称为操作符重载的东西。 Java不支持用户操作符重载,但了解这些工作将如何让您更好地了解同一个操作符可以根据上下文使用不同的逻辑。

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

+2

深入研究处理器,它只是一个比较指令。现在,CMP操作码的不同寻址模式可能取决于CPU架构。在非常基本的模式下,将使用一个带有索引(与堆栈变量相关)的帧指针来读取这两个变量,并且将生成跳转等于或跳转不等于操作码。 –

+1

实际上,类似于整数类型的'=='的实现实际上与它如何实现对象引用相同,因为对象引用_is_只是一个数字。 –

+0

詹姆斯和瓦伦你都是对的。我将编辑我的答案以反映这一点。 – Jcross

0

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

JVM适用于两种数据类型。

根据JVM 7 specification

像Java编程语言,Java虚拟机运行 对两种类型:基本类型和引用类型。相应地,有 ,两种可以存储在变量中的值, 作为参数传递,由方法返回,并在以下基础上操作:基本值 值和参考值。

参考文献也是类型reference的值。

Java虚拟机包含对对象的显式支持。一个 对象是一个动态分配的类实例或一个数组。对对象的引用被认为具有Java虚拟机类型 的引用。类型引用的值可以被看作是指向 对象的指针。可能存在对一个对象的多个引用。对象总是在 上运行,通过并通过类型引用的值进行测试。

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

例如, lcmp - 比较两个长值

最后,JVM的运算是给定的操作数字节算术。