[讨论] JVM中==的实现

喻红叶 2014-08-15

Java中的类型可以分成两种:基本类型,对象。Java中的对象一般分配在堆上,Java中有reference类型作为对象的引用,其保存的是对象在内存中的地址,一般内存中的地址都是一个整数,所以我可以把reference中保存的内容理解为一个数值吧?

==在比较基本类型时,判断它们的值是否相等;而在比较对象时,判断它们是否是同一个对象,其实==判断的应该是对象的引用,也就是两个数值。

那么,是不是可以这么说,==其实就是判断两个变量所代表数值是否相等?JVM在做==运算时,是怎么区分比较的是基本类型还是对象,或者根本就是如上说述,直接比较两个操作数的数值?

ZHH2009 2014-08-18
判断==两边是基本类型还是引用,在编译期是已知的,所以不需要在JVM层做的,在Javac这一层就已经推断出来了。

若==两边是引用,Javac会把它翻译成if_acmpne字节码(注意不是if_acmpeq),
引用在HotSpot中就是个内存地址,
然后执行if_acmpne字节码对应的汇编时就是直接对两个内存地址进行比较。
Global site tag (gtag.js) - Google Analytics