这道题仍然是考察JVM层面的基本知识,面试官认为,基本功扎实,才能写出健壮性和稳定性很高的代码。
涉及到的技术知识
(x.equals(y)==true),这段代码,看起来非常简单,但其实里面还是涉及了一些底层知识点的,首先我们基于equals这个方法进行探索。
equals这个方法,在每个对象中都存在,以String类型为例,其方法定义如下
publicbooleanequals(ObjectanObject){if(this==anObject){returntrue;}if(anObjectinstanceofString){//判断对象实例是否是StringStringanotherString=(String)anObject;//强转成string类型intn=value.length;if(n==anotherString.value.length){//如果两个字符串相等,那么它们的长度自然相等。//遍历两个比较的字符串,转换为char类型逐个进行比较。charv1[]=value;charv2[]=anotherString.value;inti=0;while(n--!=0){if(v1!=v2)//采用`==`进行判断,如果不相同,则返回falsereturnfalse;i++;}returntrue;//否则返回true。}}returnfalse;}
首先来分析第一段代码,判断传递进来的这个对象和当前对象实例this是否相等,如果相等则返回true。
if(this==anObject){returntrue;}
那==号的处理逻辑是怎么实现的呢?
了解==判断
在java语言中==操作符号,这个比较大家都知道,是基于引用对象的比较,具体其实还有一些其他的区别。
JVM会根据==两边相互比较的操作类型不同,在编译时生成不同的指令。
对于boolean,byte、short、int、long这种整形操作数,会生成if_icmpne指令,该指令用于比较整形数值是否相等。关于if_icmpne指令可以参见:Chapter4.TheclassFileFormat,它在HotspotVM中的bytecodeInterpreter源码中的具体实现如下
#defineCOMPARISON_OP(name,