00:00
各位,我们来看一下响约模式,他在JDK源码里面的使用,那么找了一下,在JDK里面有一个类叫integer,好,那这个呢,我们。都用过是吧,这个integer里面呢,它有一个地方就用到了想猿模式,那我们来来看一下这个这个代码,这有一段代码,同学们,这段代码呢,我先不写了,因为比较简单,我拿过来先问大家一下这个结果是什么,然后我们我们再来分析,好吧,那打开jdk source。对,然后这地方我们写上。这个一个响应模式,我们就叫FLY。FLY的一个测试案例。那同学先来看这个,这段源码运行的结果是什么,同学们可以看到这里。这里我们用integ.value of127,然后返回了一个X。就说得到一个实例。得到了一个X这样一个实例,那这个实例的类型,各位实例类型是不是就是integer。
01:03
没毛病吧?下边我们可以看到,我们又得到一个实例Y。没问题,Y它的类型呢,也是英特尔,下面以此类推,我就不一个个的讲了,现在的问题是先先先说第一个system.out x.es.y这个结果是。一个什么样的结果?X是一个127的一个integrity y也是一个127的一个integrity,那显然这个比较的是内容,比较的是大小嘛,所以它应该是为初。为什么?这两者肯定相同嘛?处TE,那么我们再问,X和Y它们是不是同一个对象?X和Y。The off。这有个inter。显然这两个不是因为。大家可能想当然认为他们是不同的嘛,所以说对方他返回的结果应该是什么,就是forces。我们再看XY,我先把结构写出来,X和ZZ呢,它也用的是value of。
02:06
好,我告诉大家这个结果。他是处。它是处,为什么是数,待会大家就明白了,我们再来看W和XW又是六的一个,和X呢,这个地方是false。好,W和Y呢?W是六出来的,Y也是六出来,虽然他们都是127,但是呢,他们也是方式不是同一个对象,我们先运行一下这个结果,看对不对。首先我们运行之。第一个根据刚才老师的分析,第一个是醋。出正确,False正确,第二个下一个出,再下一个false,再下一个false,正确的好,也就是说我刚才分析的这个结果呢,是正确的,现在我重点就是要考虑一个为什么,为什么X和Z它是同一个对象实例。
03:00
你看啊,你X是通过value of返回了一个。实例的,而这呢,也是通过value of返回的一个实例,为什么他们两个是同一个对象呢?来打开这个value of的源码,往这一追,大家一目了然了。同学们可以看到,在value里面,这是一段代码。这段代码如果细心的同学观察,你们就会发现它是这样返回的,它有两种情况,如果说你要得到这个I的范围是在这个范围是大于这个值。并且小于这个值的范围以内呢,我就从里面一个缓冲池,缓缓冲层,或者叫做或或者叫一个缓冲池里边获取这个对象直接返回,而大家看到indi catch.catch显然这个catch是他的一个静态方法。能看懂吗?OK啊,那现在呢,如果说他这个地方不在这个范围以内,那么它返回的是什么呢?它就是返回一个新的。
04:01
Integral,也就是说你刚才在做这个案例的时候,大家可以看到你在这个地方是。127,这也是121,他们刚好满足在这个范围内,为什么呢?因为这个no派的范围刚好是什么范围,我来搂一下那大跟上我的代码啊open,我们发现no是负的,128。那么high呢,这个值大家看氦这个值,它这没有给,但是在下面给大家看,这有个静态代码块。在这个静态代码库里面呢,他给这个H负了一个值是127,然后往下走,大家有没有发现在第。800行,他把这个H给到了氦,也就是说氦的值其实就是127。那现在我们就明明明确了啊,也就是说。也也就是说什么呢,我们整理一下。如果待会我们再再说啊,如果这个一这个通过这个value of integer。
05:05
注意听这句话,如果你通过intake value of这个X在什么呢?在负的127。到。正的128之间。干什么呢,就是使用的什么呀,想圆模式。范围。小猿模式刚才讲过了,如果没有就创建一个,如果有就直接返,那我问大家。如果不在这个范围以内,是不是他就没有用响应模式了?换言之,就是说如果我这样写,同学们。你们看这样写它会是什么字,我们integer。好,In in,注,听integer.off如果我这写的是200。各位。200 OK,那现在这个地方这个值叫X1,各位,我们再来一个X2。
06:00
那么它的值是200,我问大家一个问题,此时此刻,此时此刻这个X1等于X2吗?那不等于,那你要看它有没有在这个范围内,如果他不在这个范围内,它仍然是用六的方法,一是下面这句话,就如果不在。该范围内。范围内。则。则仍然。仍然六一个性的对象,为什么大家从这个代码里面其实可以看出来的。是不是这样子的?孔雀看。如果在这个范围里面,就从这个缓冲缓冲池里面去,如果没有六一个,因此同学们可以看出来,因为你这个200已经不在这个范围的,所以说它两个是X1和X2。他不是同一个对象,因此他返回的是boss。是不是这样子的呢?我们来执行一下,给大家看一下。OK x1等于X2是否?等于一个词来运行字,我们发现这个地方,诶不好意思。
07:02
不好意思啊,这个地方我们要这样写的话,应该是把它关起来。刮起来啊来运行,我们发现这两个应该返回的是一个force,没问题吧,好同学们,这个地方我们分析就到位了。那现在同学们现在呢,我们把这个代码简单的小结一下啊,小结一下里面的源代码其实很很清晰的看出来对不对,如果是这个范围,我就从缓冲呃,那个缓缓冲池里面去,如果不是就另一个,而什么叫缓冲池呢?从个在这个范围里面,范围里面我们追了最大到最小是负的,128,最大是正的啊负的,刚才我写错了。这不好意思啊,是负的128。大的只是127啊,我把这个改一下,不好意思。127在这个范围里对不对,在这个范围里还用显约模式好,我们现在呢,从这个代码里面可以看到它是怎么做的呢?大家看他在第一次六这个in,呃,Inegr catch的时候,大家看关键代码就行了,他首先创建了一个。
08:06
呃,数组catch数组,这个catch数组的大小是氦减no加一,为什么这样说做的呢?因为我们这个数组啊,它的下标不可以为负数,因此呢,它把这个氦减掉,这个诺尔过后,是相当于把这个数组变成了多大呢?变成了能够存放负的100,负的负的128到正的127之间的一个这这么大的一个数组,然后再往里面怎么样一个个放数据。就这意思,OK,好,那大致大家应该明白了,小结一下,代码首先在哪里呢?在value of。在value这个方法中,方法中OK干什么呢?先判断先判断呃,这个值值是否是否在在这个什么呢?Integer。In。我们看啊,In。这个数组中。
09:00
是吧,如果不在。OK,如果这个判断,先判断这个要取的值啊,要判断值是否在这个这个里面,如果不在。如果不在。不在就干什么呢?就创建新的对象。新的一个integral。也就是说这个时候他用的是六的方法,这个大家大家能理解对吧,否则怎么办呢?诶否则否则就直接。否则就直接从哪里呢,从这个catch中。这个缓缓就从这个缓存缓存池,缓存池中。返回。对不对,缓冲池中返回就这意思。好,第二个我们再来总结一句话,再来一句话,这个value of这个方法。这个value方法,哎,这个方法。方法他就。
10:02
方法就使用到使用什么想圆模式。想圆模式,这个大家是不是就很OK了?好的,那其他我就不再一个再讲了,因为重点就是剖析这个value of,那这个new这个方法,同学们啊,六这个创建新的实例,这个没没得说好,只要把这点点搞清楚就可以了,好,同学们,那关于我们在这里这这一个JDK中in inter使用响猿模式的这个思路就跟大家聊,这其实就是很简单一个判断,事先先把东西创建好。他跟我们前面不一样的地方是它已经创建好了,直接返回,而我们前面那个网站呢,是如果没有放进去,第一次要放一下,而这个呢,是事先已经创建好了,所以说我们通过这个案例还可以得到一个一个结论,就是如果用value of啊,如果使用value of。返回一个value of方法得到一个integer实例。
11:02
而且范围范围在什么呢?范围。范围在。在这个负128到正127。这个范围里面啊,那么速度会快比什么呢?它的执行速度,执行的速度。比什么呢?它比这个六。六要快。是不是?是这样子吧,好的,那关于这一点,这个源码的分析,我们就聊到这里。
我来说两句