比较两个对象时'=='的工作逻辑是什么?

smr*_*jan -4 java

当我们使用'=='比较两个对象时,什么逻辑有效?这个逻辑写在哪个文件中?仅供参考我知道JVM检查两个引用变量是否指向同一个对象; 我想知道哪些代码必须在那里确定两个引用是否指向同一个对象?

T.J*_*der 6

最终,这归结为Java虚拟指令集指令,if_acmpeq并且if_acmpne共同描述为if_acmp<cond>:

手术

如果参考比较成功则分支

格式

if_acmp
branchbyte1
branchbyte2

形式

  • if_acmpeq = 165(0xa5)

  • if_acmpne = 166(0xa6)

操作数堆栈

..., value1, value2 ?
...

描述

value1value2必须的类型的参考.它们都从操作数堆栈中弹出并进行比较.比较结果如下:

  • if_acmpeq当且仅当value1= 时才成功value2

  • if_acmpne当且仅当value1≠ 时才成功value2

如果比较成功,则无符号branchbyte1branchbyte2用于构造带符号的16位偏移量,其中偏移量计算为(branchbyte1 << 8) | branchbyte2.然后,执行从该if_acmp<cond>指令的操作码的地址开始.目标地址必须是包含该if_acmp<cond>指令的方法中的指令的操作码的地址.

否则,如果比较失败,则执行在该指令之后的指令的地址处if_acmp<cond>.

这引出了价值观相等的问题.我认为这取决于JVM的实现.以下是关于类型值的规范reference:

Java虚拟机包含对对象的显式支持.对象是动态分配的类实例或数组.对对象的引用被视为具有Java虚拟机类型reference.类型的值reference可以被认为是指向对象的指针.可能存在多个对象的引用.始终通过类型引用的值操作,传递和测试对象.

进一步下跌:

有三种reference类型:类类型,数组类型和接口类型.它们的值分别是对动态创建的类实例,数组或类实例或实现接口的数组的引用.

数组类型包含... (这里基本上不相关)

reference值也可以是特殊的null参考,到没有对象的引用,这将在这里通过来表示null.该null引用最初没有运行时类型,但可以转换为任何类型.reference类型的默认值是null.

Java虚拟机规范不要求具体的值编码null.

如果JVM规范没有指定定义的位null,我认为它根本没有指定引用的位.这是有道理的.那时,你就在金属附近,这是特定JVM实现的工作.如果您想知道该级别的细节,至少有一个JVM是开源的.