当我们使用' =='比较两个对象时,什么逻辑有效? ?这个逻辑写在哪个文件中?仅供参考我知道JVM检查两个引用变量是否指向同一个对象;我想知道必须有哪些代码来确定两个引用是否指向同一个对象?
答案 0 :(得分:6)
最终,这归结为Java虚拟指令集指令if_acmpeq
and 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
类型值的what the spec has to say:
Java虚拟机包含对对象的显式支持。对象是动态分配的类实例或数组。对对象的引用被视为具有Java虚拟机类型
reference
。类型reference
的值可以被认为是指向对象的指针。可能存在多个对象的引用。对象始终通过类型引用的值进行操作,传递和测试。
有三种
reference
类型:类类型,数组类型和接口类型。它们的值分别是对动态创建的类实例,数组或类实例或实现接口的数组的引用。数组类型包含... (这里基本上不相关)
reference
值也可能是特殊null
引用,对无对象的引用,此处将由null
表示。null
引用最初没有运行时类型,但可以转换为任何类型。reference
类型的默认值为null
。Java虚拟机规范没有规定编码
null
的具体值。
如果JVM规范没有指定定义null
的位,我认为它根本没有指定引用的位。这是有道理的。那时,你就在金属附近,这是特定JVM实现的工作。如果您想知道该级别的细节,至少有一个JVM是open source。
答案 1 :(得分:1)
逻辑是用JVM的源代码编写的,主要是比较指针。
例如,如果引用相等,则if_acmpeq
字节码执行分支(跳转)。