00:00
各位老铁早上好啊,今天我们来谈第三道面试题,谈一谈等等和equals的区别,我们会拿一套高频的面试题来考考大家,那么这道题的话呢,很多人都没有答全对,那么你可以来试一试,那么接下来呢,先来看一眼啊,那首先的话呢,很简单,来给大家梳理一下。这个等等呢,注意它比较的是值,如果说它比较的是这个基本的数据类型,那它比较的是这个数据类型本身的值,如果它比较的是引用类型,那么它比较的就是这个引用类型纸箱的地址啊,OK,好,但这个来说的话呢,对于等等大家理解一般来说都没有问题啊,那通常来说有问题的地方都是在哪?在equals啊,Equals的话为什么呢?因为很常见的地方就是我们经常拿它来作为一个字符串的比较,比如说拿两个字符串作equals比较,然后发现呢,只要这个字符串的值是相等的,它就是to,对吧?所以呢,就会造成一种误解,就会认为equals比较的是内容,OK,好,但是啊,注意啊,这个equals它在是在哪定义的,它本身是在哪里定义的,它本身是在我们这个object这个类上定义的,所以它默认呢,你就看它的定义啊,这个类的定义大家看它源码的解读你就可以看到,那这块的话,你发现呢,比较的默认是什么,是地址啊是地址OK。
01:13
所以呢,我们看到的这个字符串,我们大家假象是什么?是因为这个字符串本身重写了一或方法,所以导致它里面比较的是内容,理解这意思吧,所以如果你去看源码的话,你可以看一下object里面关于equals的源码,然后可以再看一下string啊这个类关于这个equals方法的源码,那就发现它做了什么重写overright OK,好,所以关于这两个东西,最基础的东西就是第一环,咱们得理解正确啊第一环,那么接下来接着来咱们来进行第二环的一个考验,第二环的考验呢,就是我们这个面试题这块的解读。来跟着我来往下看一眼啊,是这样,大家看一下下面这里面,这里面的话呢,注意我是专门没有写答案出来的,也没有放到这个IDA工具来编译跑一下,因为这样的话就没有意义了啊,那好,我们下面的话呢,跟着我来看你看你猜的对不对,首先的话呢,我们来看一下,我们定义好了两个变量S1和S2,那么他们呢,分别通过这个new string的方式来创建了这么一个对象。
02:10
好,那么接下来打印输出问两指他们等等吗?等等比较的是两个东西,聊对象的一个引用的例子,那么是否相等呢?好,你的答案是什么啊?True还是false?OK,那么下面的话来揭晓答案,这个答案是false啊,这个答案是false。我先给你写一下啊,为什么呢啊,因为的话呢,在但凡在我们家里面叫new就意味着什么,意味着我需要在堆去开辟一块新的空间,所以此刻他们就会是一个各自的新空间,那么两者呢,就可是一个bos不相等。好,那么再往后看,大家看到下一个东西啊,注意这个时候没有new是S3等于张三,S4呢,等于张三对吧?好,没有new,那没有new的话呢,这个时候我们去做相等的判断,这个结果是true还是boss呢?
03:02
好,一样啊,你可以输出你的答案啊,321。好了,答案是什么呢?答案是出,为什么呢?因为此刻不一样,这两个变量的话呢,它没有new,它没有new的话意味着什么?意味着它们两个都会指向同一个常量池里面的一个地址,所以呢,这个地方的结果是true。好,再往后看第三个,那再问S3等等于S1吗?好,大家大家注意一点是什么呢?在这里面的话,这个地方是开辟一个新的空间,这个是在长阳池里面的,所以它两指要地址来说的话呢,依然是一个什么,依然是一个force。当然如果你用EQUAL4的话,S3EQUALS s1,那E4的话,因为重写了,所以它肯定是出啊,但是用相等号来比较的话呢,它就是一个什么,它就是一个false。好,一般来说啊,一般来说截止到目前为止,在这一片大部分同学都是没有问题的,都是能够过关,涨价没有问题的,一般来说会出问题都是下面这个环节,所以跟着我来看一下,下面的话呢,大家可以看到S5等于张三张三S6等于S3S4。
04:09
诶,你看这里面我是两个变量加起来。诶,看起来的话应该是相等是不是,所以的话,接下来看这道题,如问它俩是否相等。那么是出外的boss呢?OK,这个答案就有同学会搞错了,这个答案是什么呢?是false。为什么是boss呢?原因很简单,是这样的,在string这个类里面的话呢,因为它两个都是变量,S3你看它是变量,S4也是变量,所以两个都是变量的话,在此处他们做相加,那么就会干嘛呢?我们知道字符串拼接就会创建新的对象,所以当你去看你通过这块啊,同学们你可以怎么去验证啊,你可以通过反编译工具,反编译工具,然后你就会看到在此处这张代码的话呢,实际上是通过一个new,一个string build的方式啊,来创建了这么两个东西,去做两个两两个字符上的拼接的,所以意味着什么呢?意味着它要去创建一个新对象出来,所以自然而然这个S5跟S6它就不是一个什么,不是一个相等的情况,所以这个效果呢,跟咱们的那个S3跟S1呢,道理是类似的啊,OK,一个new了,相当于一个六了,一个没六啊。
05:18
好,所以这道题是false。好,那么这道题过了之后呢,再往后看下一道题是这样啊,这个时候是在更加复杂一点,它结合了final来做,那怎么做呢?看一眼啊,Final final s7等于张三,S8等于张三,然后S9等于S7加S8。好,那这个时候注意啊。这个时候是也是两个相加对不对,然后去判断这S5是不是等于S9呢?诶思考一下这个答案是true还是false呢。好,你不知道你答案对不对啊,那来揭晓一下,这个答案是true,为什么呢?因为是这样的啊,因为此刻注意这两个东西不太一样,S7S8跟刚刚的S3S4不太一样,这一块里面的话,两个是什么,它两个是常量,而常量的话呢,在这个编译里面的话呢,其实你去看一下它最终会干嘛,他相当于此刻他会变成这个样子,S9。
06:13
等于这个地方大家可以看到张三,张三它会做优化啊,它做优化变成这么一个东西了,所以的话呢,意味着什么,意味着这两个东西是一样的,看到吗?S5跟S9是一样的,所以这个是处。好,这是这这么一个东西啊,那么还有然后最后看最后一个,最后一个的话,注意这个地方的话,也会有很多同学会猜错,那么你的答案是对还是错呢?来看一眼啊,注意final。Final final类型的啊,然后S10等于S3加S10S4啊OK,然后再问这个S5等于S10等等吗。好,你的答案是多少呢?OK true还是false呢?来,我们揭晓答案一下啊,这个答案呢,是。Boss好,为什么呢?因为他们这个时候注意啊,这个时候有同学可能会被这个final给迷惑了,注意这个时候的话,这这右边这一块到底要不要创,创建新的对象取决于什么,取决于这两个对象是不是常量还是变量,但是很明显这个时候S3S4的话呢,还是变量,所以它依然会干嘛,在这个地方依然会去利用。
07:15
依然会去newsstream。Builder。OK啊,所以这个时候的话呢,他这边起的这个final作用是什么呢?只是关系到什么,关系到下一步,比如说如果说你想继续对这个什么,继续对这个S10,你说我想给你再付个新的值啊,为一个666啊,扣一波666啊是不是,诶抱歉,这个时候不行,为什么呢?因为这个东西是常量,它只能复制一次,所以这个不行,它只是影响到这一步来,但是并不影响我们这一块。所以这个答案是boss,好了啊,不知道大家有没有猜对啊,有没有猜对,OK,那这就是我们的这道题的解读啊,好了,回头呢,大家可以通过你的工具啊,去验证一下这个结论啊,然后呢,这是一道非常简单的题目,但是它本身又是高频的面试题,我们的整个计划安排是这样,我们会先把一些基础性的题目先讲了再说,然后的话呢,后面还再会讲一些有难度性的题目,OK,好,那这个呢,我们这道题就给大家分享到这里。
我来说两句