当我们使用'=='比较两个对象时,什么逻辑有效?这个逻辑写在哪个文件中?仅供参考我知道JVM检查两个引用变量是否指向同一个对象; 我想知道哪些代码必须在那里确定两个引用是否指向同一个对象?
最终,这归结为Java虚拟指令集指令,if_acmpeq并且if_acmpne共同描述为if_acmp<cond>:
手术
如果参考比较成功则分支
格式
if_acmp branchbyte1 branchbyte2形式
if_acmpeq= 165(0xa5)
if_acmpne= 166(0xa6)操作数堆栈
..., value1, value2 ? ...描述
既
value1和value2必须的类型的参考.它们都从操作数堆栈中弹出并进行比较.比较结果如下:
if_acmpeq当且仅当value1= 时才成功value2
if_acmpne当且仅当value1≠ 时才成功value2如果比较成功,则无符号
branchbyte1并branchbyte2用于构造带符号的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是开源的.
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |