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

时间:2016-04-07 14:15:08

标签: java

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

2 个答案:

答案 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 →
...
     

<强>描述

     

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

     
      
  • if_acmpeq当且仅当value1 = value2

  • 时才会成功   当且仅当if_acmpnevalue1

    时,
  • value2才会成功   

     

如果比较成功,则使用无符号branchbyte1branchbyte2构造带符号的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的值可以被认为是指向对象的指针。可能存在多个对象的引用。对象始终通过类型引用的值进行操作,传递和测试。

further down

  

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

     

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

     

reference值也可能是特殊null引用,对无对象的引用,此处将由null表示。 null引用最初没有运行时类型,但可以转换为任何类型。 reference类型的默认值为null

     

Java虚拟机规范没有规定编码null的具体值。

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

答案 1 :(得分:1)

逻辑是用JVM的源代码编写的,主要是比较指针。

例如,如果引用相等,则if_acmpeq字节码执行分支(跳转)。