00:00
接着啊,咱们往下看,下边一组呢,我们称作叫控制转移指令,那何为控制转移呢?我们就会想到在Java当中咱们规范了是不是叫分支结构和循环结构,对吧?在分支结构当中,咱们提到了有if else,有Switch case结构,循环结构里边呢,我们有for循环,While循环和do while循环,我简写了,那不管障碍语言,实际上任何一个编程语言都会涉及到像分支结构啊,像条件这样这个循环结构这样的这个结构,对吧?那任何语言都离不了的,那咱们就来看一下像刚才提到的这样的一些结构,在咱们自解码指令这个方面呢,是有哪些指令与之相对应,这就是我们这一节要提到的叫控制转移指令。好,那咱们来看一下,说呢,流程控制离不开条件控制,那为了支持条件跳转,虚拟机呢,提供了大量的字节码指令,大体呢可以分成这样的几类。啊,比较指令条件跳转,比较条件跳转,多条件分支跳转和无条件跳转,那一共呢,分成了五类,那大家呢,可能会看到咱们这块讲的话呢,你看是不是只有四类啊,那差哪一个呢?这样一对比发现呢,少了是第一个叫做比较指令。
01:10
那比较指令怎么看待,实际上呢,准确的来说,这个比较操作呢,应该算作咱们的算术指令,所以说在这个算术指令这块呢,咱们算术指令对吧,在这块呢,我们就列举出来了,咱们所有的这个比较指令。那在这呢,一个专门关于比较指令的一个说明,行,那首先呢,咱们来提一下这个比较指令。首先来提一下比较指令,咱们在当时讲这个算术指令的时候呢,其实我也说了一下,说这个比较指令呢,咱们重点呢是放到下边来说,就是我们到控制转移这块来讲。啊在这讲,那我们看一下这个比较指令12345是不是有五个呀,那原位D呢,就是这五个指令的话呢,都是用于数据的比较的,就是谁大呀谁小啊对吧,它呢是将占顶的两个元素呢,给它取出来比较一下谁大谁小。
02:01
那既然涉及到这个数据的比较大小了,那大家想一下什么类型的数据我们可以去谈大小呢?对吧,那实际准确来讲呢,应该是是不是数值类型的,这个数据是不是才可以谈大小啊。这个应该是非常明确的,对吧,你比如说咱们说的这个布尔类型,一个是他还有是谁呢,咱们说这个引用类型。引用数据类型他们呢,是不能比较大小啊,那同学说,哎,老师不对吧,这个咱们这个引用数据类型像对象,对象不是也能排序吗?排序的前提不就是比较大小嘛,这个话是没错,但是我们真正去比较对象的大小,实际上是不是还是借助了具体的这个数值啊,那举个例子,大家呢,比如说你点了个美团外卖,然后这边就是我们比如说美团外卖的每一个这个店家,或者大家呢,你进行一个就是今日头条的这个查看这个新闻,那新闻的话呢,其实它有一定的顺序,包括你做百度查询搜索对吧?诶都有一个一个顺序,那这里边的每一个item呢,我们其实都可以看成是一个对象,那这里边呢,显然这些数据呢是有顺序的啊,淘宝也是,你可以按照价格呀,按照这个评论数啊,或者这个信誉啊等等进行排序,你看我刚才说到的按照什么什么排序,涉及到这个标准,其实是不是都是数值啊,比如说你按照价格,价格是不是有个double类型,按照这个评论数是一个整形,按照这个信誉,这也是个整形,对吧,那这时候呢,其实我们也是按照具体的数值。
03:31
十来分。来进行这个排序的,也就是说呢,我们其实说对象排序,不能拿着这个对象本身去比较谁大谁小。这项呢,你比方说它俩是不是等等,或者它俩是不是不等,不能说谁大于谁,谁小于谁,那我们只能拿它中的这个属性是数值类型的才去比较大小,对吧?好,那先明确这个问题,然后呢,既然回归到这个数值类型了,那我们说数值类型呢,种类其实挺多的,对吧?那咱们前面也有一定的经验了,知道呢,像这个BA呀,Short呀,叉啊,是不是咱们就可以统一的用int来表示,那除了这个。
04:07
这个BAT。Short car这个之外呢,咱们剩下的这几个,就是他们几个呢,是不是都看成是int,那我跟也跟int这个就挤在一起了,这个呢,可以看成是一组了,对吧?那除了这个之外呢,是不是还有这个叫浪类型的float。还有这个叫double对吧,还有这样的几个类型行,结果呢,我们会发现呢,这里边儿指令只有是不是这三种。只有这三种,怎么没有前面这几种呢?哎,这里边儿呢,我们就哎要聊一聊了。大家发现你看这里边带了个D,那表示呢,就是double带F的呢,就是float带L呢,这就是long。那首先呢,先别说你这里边为什么没有int,怎么说这仨里边这个long这块就一个呢,那我们先把这个问题说一下,那其实呢,这两个指令和这两个指令就是针对的类型不一样啊,对吧,那单纯的来看float类这两个呢,其实它们的差别不大。
05:04
或者说呢,在绝大部分场景下呢,它俩都是一样的,你看这里边儿我写的。指令它啊,指令它和这个指令它,你看这个呢,相当于是compare f呢就是float,这个呢,CMMP呢就是compare的意思,这个G呢就是great greater可以这样大于是吧,这个呢是lower,就是小于的意思,所以这两个呢,其实主要呢,就是比较这个数据的大小的,把这个占顶的操作数占顶呢,两个操作数呢,给它取出来比较大小,那是这样的意思。这呢是这个占顶我们叫做top,这个呢是咱们这个站顶叫做bottom。行,然后呢,我们这个站井上边这个呢是V2,下边这个是V1,这个V1这个V2行,那比较它俩这个大小,注意V1的是在下边的这个,如果它俩要相等呢,就是这俩哥们呢,咱们拿这俩指令去比的时候,他俩就都会出战,出战之后呢,看看如果说他俩相等,那我就接下来压入一个零进来,如果呢,是V1大于V2,注意下边这个大啊,如果V1大于V2呢,我们就压入一个一进来,如果呢,V1小于V2。
06:08
V1小于V2,那我们就压入一个负一进来,所以是这个意思,这两个指令在刚才说的这个场景下呢,它俩是一个一个意思啊,它俩是一个意思,那这俩的区别在哪呢?下边提到了两个指令的不同之处呢,是遇到na的时候。咱们知道float和double呢,都可以取到叫not number是吧,那这个情况下呢,这个我们说这个G的它呢是压入一,而这个L入的是负一。哎,这块呢,是它们俩有区别,但是一般场景下呢,咱们其实正常操作的话呢,是不是都很少遇到na啊,所以那大部分场景下,大家认为它俩一样就行,而我们这个D开头的double呢,也是同样的道理,类似的有同样的道理就行啊这块就写了对吧?行,那对于咱们这个浪类型的,大家其实也自然而然就知道了,你俩呢,主要在na这块有区别,而我们浪类型本身就不可能取到na对吧?所以它就自然而然的就没有说两组了,就只有这一组就行,就是LCMMP就compare的意思就OK了啊行,那首先呢,我们先搞定了,就是对于这三组里边为什么L没有配对的这个问题,然后接下来呢,再谈一个问题,就是说诶这三个搞定了,那为什么没有int类型呢?
07:22
对吧,大家会发现怎么没有int类型呢?那这呢,我们就要提到下一个问题哈,就是我们这里边的这三种类型去比较大小的目的,你看咱们最终目的是不是压入一个整数啊,或者说准确来讲这个呢,我们就把它看成是int类型了。言外之意,为什么没有int类型?是因为咱们只有这三个类型的目的呢?是希望通过这一些指令的一些判别运算比较是吧?最终结果呢,得到一个int类型,那有了int类型了,接下来咱们就可以做一些条件跳转相关的判断了。
08:00
哎,同学呢,是感觉上自己应该是听明白了,但是似乎呢,好像又没有太明白是吧,那这种感觉呢,其实是最好的是吧?那咱们接着再往下一分析,这大家就清楚了,你看嗯,为什么咱们这块呢,要讲这个控制转移这块性向比较呢,因为很多场景下呢,咱们条件跳转呢,跟这个比较呢,都是结合来使用的,刚才呢,咱们刚把这个比较指令是不是说完了,对吧。
我来说两句