00:00
大家好,我是海波老师,接下来我们继续给大家讲Java面向对象的语法,我们这里呢,来拷贝一下,我们来写个九。把后面的呢都删掉好点击OK,然后呢,把里面的东西啊,咱们都给它删掉啊就可以了,我们接下来呢,主要给大家讲一下我们的这个比较等于的问题啊,所以我们这里来写上它,我们叫做等于。那么这里比较简单啊,咱们平时的等于啊,就是等号嘛,所以呢,我的int给它一个二,它等于十,然后呢,我写上一个勾,它等于十,非常简单,两个相同类型的基本数据类型,它们比较的时候就看两个值相不相等,所以我们这里直接写上一个勾就可以了,对吧?然后呢,我们来运行一下,这个很容易,它的结果应该为处对吧。好,那么我们现在呢,我们把它的基本数据类型呢变一下,比方说我再来一个,咱们叫做double,给他一个D,那么这时候给他一个10.0,那么这个时候我们的这个I和这个D相不相等呢?所以我们这里来,我们叫做I,它等不等于D。
01:00
我相信啊,有的同学说老师不相等吗?不都是十吗?但也有同学说,老师你看有个带小数点,有个不带小数点,可能是不是不相等啊,所以我们这里来运行一下。运行以后,我们来看我们当前的结果,你会发现我们这里还是true,这说明啊,我们基本数据类型当中的数值的一个比较啊,它确实只要你数值相等,它都可以比较为true,这个没有问题,即使你的类型不相等也是可以的,对不对?哎,就是这个道理,好了,我们接下来写字符串,我们写上string,我叫S,它等于ABC,然后呢,我再来个一,它等于ABC。我想看一看这两个字符串是否相等怎么办?其实也非常简单,我们这里呢,直接我们的S,它等不等于S1就可以了,对不对,诶就是这样的,哎,老师你这么写相不相等呢,我们说应该是相等的,所以我们运行一下。那么我们这里啊,我们说为什么会相等呢?大家看一下结果没有任何的问题,这是因为啊,我们Java对我们的字符串它做了优化,因为咱们对字符串的操作呀,太频繁了,所以呢,他就把我们重复出现的这种双引号的字符串呢,它做了封装,它给它封装成常量,那么也就意味着我们这个ABC和这个ABC它们其实是同一块内存,所以我的S和S1它们指向的是同一块内存中的对象,所以他们内存地址相同,那么所以也就意味着我们的双等号是没有问题的,对吧?因为双等号就是比较我们的内存嘛,这里咱们就要说一下了,咱们的基本的来写上基本数据类型,它的那个双等号,它比较我们的数值。
02:38
对吧,比方说布尔类型就是比较你处还是false嘛,那么咱们的数值啊,就是比较你的数值大小嘛,哎,就这个意思,所以我们比较数值相不相等,就是这个意思,但是引用数据类型记住了啊,咱们这边写上它,咱们叫引用数据类型。引用数据类型呢,诶写上引用啊,数据类型双等号,比较的是我们变量的内存地址,记住变量指向的内存地址到底是不是同一块地址,这个就非常的重要,这是我们的双等号,但是呀,麻烦了,为什么?因为咱们字符串你比较内存地址没有意义啊,我们一般是比较内容啊,所以大家看一下,我写上叫string,我们叫S2,我这里写上new,然后呢写个string,然后呢,我这里写上叫ABC,你会发现呢,我当前还是ABC,我就想判断一下S和S2相不相等,所以来写上它S和S2相不相等来运行。
03:34
运行以后看结果。我们会发现它就是false了,为什么?因为我们的这个双引号的字符串跟我new出来的对象,他们的内存地址是不相等的,啥意思啊?一个是我们Java做了优化,把它放到了一个特殊的区域,我们称之为叫字符串啊,常量池。而我们这里呢,纯粹就是构建了一个新的字符串对象,所以这两个位置它的内存地址是不一样的,你内存地址不一样,那所以双等号肯定是比较不对的,所以它的返回结果确实是false,哎,老师呀,但是我比较的是它们的内容不是它的内存地址怎么办?所以呢,我们接着写,我们叫S点,我们叫ES,我们刚说过了,有一个equals方法,专门是比较两个字符串的内容相不相等的,所以你把这个我们的S2你放过来。
04:26
放过来以后我来看结果,记住这个时候就不是比较内存地址了,而是比较它的什么我们的内容,所以呢,我们现在运行一下,你会发现我们的最后一个判断应该是我们的处,但是我前一个双等号应该是我的false,这个咱们前面不都说过吗?没错吧,诶,所以字符串的比较啊,我们说一般不会用双等号,我们数值类型我们一般会用双等号,但是我们字符串一般就用ES判断,哎,就是这个道理。好,这是我们的字符串,我们接下来呢,再写上一个叫class,我们叫U9,然后呢,诶我们把它写上,写完了以后,我接下来我写上叫U的九,它等于U等于new,咱们叫做U的,好了,我写完了以后,那我现在呢,准备去测试一下,干嘛呢?我再来一个,哎,把它复制一下,复制以后我写个一,我写个二,然后呢,我们来写上它,我想看一看它们两个相不相等,所以U1,诶双等号,我们叫U2。
05:27
你这么写完了以后,记住了,同学们,我们这个双等号在引用数据类型,就是判断两个变量它的内存地址指向是否是同一个,那你这拗一个,你这拗一个明显在内存中是两块区域,咱不是讲过吗?只要你拗一定是产生一个新的内存吧,那所以又拗,那就产生了两个对不对,哎,就是这样,所以呢,我们这里给它运行一下,看结果。运行以后你会发现我们当前肯定是false,哎,老师呀,那我用equals行不行,你不说了吗?Equals比较内容吗?好,我们来写上。
06:02
把U1我们来写上叫做点,我们叫equals,把那个U2我放过来,没错吧,我放过来以后,那现在我运行一下,运行以后我们来看结果,你会发现我们当前的结果它依然是falses,哎,老师这我就不明白了,你双等号啊,是比较内存地址,那这个e cos比较内容,它咋比较的。对吧,你要说我的字符串的比较内容啊,哎,每个字符相不相等,这个好理解,可是你对象是怎么比较的呢?其实啊,这里给大家解释一下,我们的对象的E方法其实来自于它的类叫object,所以啊,我们点进去我们看一眼点点进去以后你会发现它其实底层用的就是我们当前的双等号。也就意味着我们如果什么都没有做的情况下,什么都没有做,只是创建了一个类的话,那么这个E口跟这个没有本质上的区别,两个完全相同,哎呀,那不行啊,老师,我就想去看看我们对象中的一些属性啊,我们的一些值啊,是否相等啊,哎,我根据这个来判断我们两个对象相不相等,可不可以,可以,那这个时候你就要重写它的ES方法,所以我们这里来,我们给它重写一下,重写的时候把那个ES方法给我重写了,点击OK,点击OK以后,那这时候呢,我就为了简单起见干嘛呀,我直接给个true什么意思,就是说在我运行过程当中,我不再使用我们父类所提供的那个equals方法了,我要用我们当前重写的这个方法,那么这个方法肯定为处嘛,对不对,诶,所以我运行。
07:35
运行以后,你当前的结果它就为数了,你看这个就没有任何的问题,所以啊,同学们,如果以后在工作当中,你想判断两个对象相不相等的话,你需要重写咱们的echcos,其实啊,为了稳妥起见,我们一般还会重写另外一个方法来,我们给他重写,咱们叫哈希code,为什么要重写这个东西呢?是因为咱们的哈希code不就可以理解为内存吗?你都让两个对象相等了,我能不能认为他们两个的哈希code也相等呢?对不对?你这样的话不就好理解了吗?这样的话要比你单独的去重写ES要好很多,为什么呢?它俩能够当成一个整体来做,对吧?因为我的内存地子相同,所以呢,我们的eo的相同,当然我这个相同是逻辑上相同,对吧,并不是说真的就存在了一个地方,不是那么个意思,我这里只是给大家解释一下它们的关联关系,我们一般重写的时候,我们的ecos和哈希code我们都会重写,同学们能明白老师说的意思吗?
08:34
好了,如果同学们能明白老师说的意思的话,咱们再给大家举个例子,咱们说什么呢?叫包装类来。咱们的这个叫integer,我们给他一个I,我们给他什么呢?给个100,好了,我再给大家写一个,我们叫做I2。好,等于我们的100,好了,写完之后呢,我就想判断我们两个包装类型相不相等,所以我们这里来换过来,我们叫I1,它等不等于我们的I2,好了,同学们,我前面都给它注掉啊,前面都比较简单啊,什么基本数据类型啊,什么字符串,什么我们的引用数据类型,对吧?哎,这个叫包装类型,其实包装类型啊,它也是引用数据类型,所以我们叫包装类型。
09:15
我为什么讲它呢?是因为包装类型啊,它恰恰跟基本数据类型有了一个关联嘛,对吧?好,现在呢,我们来判断一下我们的I1双等号I2,诶老师我知道了,你不讲了吗?咱们的引用数据类型的话,那么我们都是什么,我们看变量的指向内存呢,那么你这两个内存,诶这100的内存和100的内存是不是相等的呀,为什么数值嘛,你两个是数值吗?那所以我运行一下运行。运行以后我看一看是不是同一个数值啊,就跟那个字符串ABC一样,我来观察一下,哎,你会发现好像真的是这样对吧,你这是100,我是100没问题,好,那我这里干嘛呢?我再写个1000,我再写个1000不还是数值吗?那么好你再来运行。
10:01
再来运行以后,大家会发现我们当前的结果就不是出的,诶这是什么意思啊,怎么刚才我们100没问题,怎么1000不行呢?那我改改,比方说我们这里改成我们的200行不行呢?来写个200。这200好,我运行一下,运行以后,诶我们看一看。回200也不行,100可以,200不行,嗯,那我一百五试试,咱们150,我这里给他来个150,我们来运行一下。我们来看看。你看也不行哟,那我再来试一试,我写个一百一啊,写个110,写个110,我们来运行一下看结果。你会发现诶为数了哦,老师我好像能够知道了,是不是有什么东西在里面,导致它在什么情况下为数,什么情况为false呢?所以啊,这里给大家解释一下这个东西,我们需要给大家稍微说明一下,什么意思呢?我们为什么会出这种情况,这个咱们讲过,其实啊,什么意思呢?我们当前的110,它是不是一个我们的int类型啊。
11:07
我们的int类型如果想变成我们的integer类型的话,那么其实它底层是调用了方法的,为什么?因为我说了Java虚拟机它为了操作方便。操作方便,它简化了很多操作,啥意思啊,本身它的准确写法呢,应该是什么呢?应该是我们的a integer点,我们叫value of,然后给它个100,还记得吗?同学们,我们真正的写法应该是integer.value of,我们这有个100,应该是这样的,所以说我们两个其实应该是这么写才是对的啊,同学们不要忘记了啊,这么写是对的。好,你这么写的话,你用了一个value of,我们说过了,只是呢,我们用的太多了,咱们的Java信息给他们简化了,但本质上应该是这两个方法,那么这两个方法它在干什么呢?我们可以稍微的看一看,我们点击一下点点击以后你会发现它在这个地方其实是有判断的。
12:09
什么意思啊,我们不用看那么仔细啊,同学们,咱们大概看一看就行了,它有个叫new什么意思?也就意味着如果上面的条件,他如果要不满足的情况下,它就会拗出一个包装类型的对象,拗一个就产生了一个对象,拗一个就产生个对象,所以也就意味着如果我们这个是拗,它也是个拗,那么这个时候他俩肯定不相等,但恰恰如果它要不是拗呢,也就意味着满足了这个条件怎么办呢?诶大家会发现我们这个地方如果满足,他就会从这个地方叫做cash。我们称之为叫缓存,在咱们引提当中有个缓存类,缓存了一些数据,那么这个数据是多少呢?他就告诉你了,默认的缓存数据呢,是负的128~127,也就意味着在这个范围之内我们有了缓存,所谓的缓存就是别人帮你提前准备好了,你可以直接拿过来用。
13:07
同学们记住了啊,在当前情况下,我们这个地方有一个我们叫做inter的一个缓存操作。缓存操作呢,是我们的负的128到我们127,为什么?因为这个恰恰咱们用的多呀,你用的多哎,我提前准备好,你不用每回都创建对象,这不挺好的吗?好的同学们,我们验证一下这个效果啊,怎么验证,怎么验证呢?把它改成127。我改成我们的127好,改了,改完之后我们运行一下看结果,你就会发现它的结果肯定是我们的处,为什么呢?因为它在我的范围之内,但是呢,如果我改成128,诶改成128好了,那这个时候我们就来看一看,运行一下运行。运行之后我们的结果应该是我们的boss现在就是临界值嘛,咱们127就是一个临界值,我们负的128是一个道理,来我们写上负的128,来把它运行一下,运行以后看结果。
14:02
你会发现它也是处,但是呢,我改成负里边九。好,改成一百二九,然后呢,我们运行一下看结果,那么这个时候你就会发现我们当前结果为false,对吧?把临界值给大家演示一下这个就可以了,其实为什么给大家讲这个呢?就是因为他们的判断,其实呀,我们说容易造成歧义,什么意思呢?当你使用两个类型的时候,恰恰你可能用双等号,你如果用双等号的话,它比较的恰恰就有可能是这样的值,那么可能跟我预想的结果就不一样了,所以以后包装类型的比较不要用双等号,对吧?不要用双等号干嘛呀,咱们换一个,咱们也用ES,所以我们来点一下要点叫ES,我们这里的ES就不是比较内存了,所以我们写上一个L好了。写完了以后,负的129,负129,我们运行,运行以后你会发现它这个里面,它其实就是我们的处没有问题,同学们能不能明白以后包装类型咱们都用ES,或者咱们这么说吧,所有的引用数据类型咱们全都用ES,我们所有的基本数据类型都用双等号,你把这个给它明确了就行了,我就担心啊,大家别用错了,对吧?好了,我们这个数据相等的操作就给大家说到这里。
我来说两句