00:00
好了啊,那接下来咱们开始今天的这个内容了,各位啊,今天呢,咱们这个常用类肯定就结束了,如果还有时间的话,还可以再继续往下进行啊,我们来看一下,我们把这个自动装箱和自动拆箱,我们再来说一下啊,再来说一下来这个inte这一块啊,我们去新建一个class,这个class我们叫in teacher什呀,TEST05好建出来啊,建出来之后呢,我在这我再写上那句话啊,叫好消息是吧,这个好消息是什么呢?在什么呀,在加VA5之后啊,或者JDK1.5之后,在JAVA5之后啊呃,引入了一种新特性啊,新特性自动装箱。和自动拆箱啊,自动装箱,自动拆箱,这个自动装箱就是基本数据类型自动转换成什么。包装类啊,自动拆箱是什么意思?是包装类自动转换成基本数据类型啊基本数据类型好,那我问大家问题,那个类里边的方法是不是没用了。
01:11
是不是没用了?各位告诉我是不是没用了?来给个回应,Number当中的那个number这个类当中的方法是不是就没用了,我们就不用学了,对不对。还说什么?啊,因为有了自动装箱和自动拆箱这种机制,Number还记不记得,我们可以找一找这个类。打开,哎呀,这个类是我自己写的是吧,来。再来一次。Java点啊这个。好,大家看这是不是一个抽象类啊,这个类里边是不是很多方法呀,对吧,这个方法是bit value啊,Short value啊,还有int value,你像这些是不是都是把包装类拆成这个基本数据类型啊,都是转换成基本数据类型吧,哎,所以呢,我们这个number这个类当中的方法我们就用不着了,因为有了自动装箱,自动拆箱啊来有了自动拆箱之后啊,Number类中的。
02:16
方法就用不着了啊,就用不着了,各位啊,给大家提个醒啊,来PSVM。大家注意听啊,来看了in t啊,TX呢,等于多少啊,900吧,假如说in t X等于900,你看900是什么呀,900是。基本数据类型对吧,X呢是包装类型,包装类型。这个过程叫基本数据类型自动转换成我们的一个包装类型啊,这叫自动转换,允许了啊,允许了自动转换,那么这个过程我们叫自动装箱。
03:09
那假如说现在呢,有一个int类型的Y等于X。那么大家注意现在呢,这个X是包装类型。对吧,Y呢是基本数据类型啊,然后我们的一个包装类型。自动转换成我们的基本数据类型,那这叫自动拆箱,自动拆箱啊,一个是自动装,一个是自动拆,你看编译没没没没报错呀。别也没报错呀,各位程序正常啊是不是,哎程序程序正常啊,你输出X,它会调度的to方法的,这个to方法放心吧,它已经肯定是重写了,你就不用想了啊,肯定已经重写了,我们再输出Y。对吧,哎,输出呗。
04:03
这个Y的话是基本数据成900啊,当然是两个都输出900是不是,哎,我们执行一下啊走。来看一下啊,看一下稍等。是不是900是不是好,那么再来我们现在呢,有个in z呢,等于什么呀,比如说1000啊,然后呢,S out z加上一,为什么这个没报错,各位分析啊分析为什么这个没有报错呢。嗯。这个加号不是只能算数字之间的加法吗?这是个对象啊。啊。他为什么能能加呢,在这儿。啊,它为什么这个加号,这个加号左边不应该是个数字吗?它Z是个是个引用啊。哎,自动拆箱机制啊,伟峰说的很好,它这个地方它会自动把Z啊转换成基本数据类型。
05:04
啊,运算符加号在用的时候,它会把这个引用数据类型这个对象,这是个对象啊,它会把它转换成什么呀。哎,会转换成这个基本数据类型啊,加号两边要求是基本数据类型的数字。对吧,Z是包装类啊,属于基本数据类型。这里会进行自动拆箱啊,将将Z转换成基本数据类型啊,它会把这个Z自动转换成基本数据类型,做加法运算。很神奇吧,所以说大家想自动装箱和自动拆箱这种机制,它存在的目的是为了什么,各位。自动装箱自动拆箱有什么好处啊?体会到了吗?自动装箱和自动拆箱的好处是什么?
06:05
自动拆箱的好处。自动拆箱。的好处就是为了方便编程啊,方便编程就是这个意思,为了方便写代码对吧,为了省懒劲,但如果是你在你在加满五之前,对不起啊,你这么写就报错了。听懂了吗?听懂了吗?各位在JAVA5之前哈,你这样写肯定编译器报错,因为你加号只能加俩数字啊,你这是个对象啊,你对象加一个这啥玩意儿啊,没有这种语法是不是在加完五之后诶,你可以这样去写了。明白吧,哎,你可以这样去写了啊,Z是个引用,Z里边存,哎各位我问大家问题,Z里边存的是个对象内存地址还是Z里边存的是1000啊。大家思考一个问题,Z里面存的是啥?现在这个Z。就这个ZZ里边they还是个in teacher,它是个。
07:03
它是个什么东西啊,这里面存的是是一个对象的内存地址还是还是1000啊各位。这里面存的是啥?Z变量就是Z变量,Z是一个引用,你要知道啊,Z是一个变量啊,这个Z还是保存了一个对象的什么内存地址。明白吗?Z还是保存了一个对象的内存地址。听懂了吧啊。嗯。Z里边还是保存了一个内存地址。实际上这个代码在执行的时候还是等同于谁,各位完全等同于in teacher z等于new一个什么in teacher,然后1000,你懂什么意思吗?懂不懂什么意思?Z里边保存的还是对象的内存地址。他还是扭出来一个teacher。六出来的啊,六出来的来我们在这测一下,TA呢等于1000IN t b呢等于1000,然后输出呢,A呢等于等于B,这个结果是true还是false?
08:16
这个双等号这个结果这个这个最后是true还是false呢。各位。我们运行一下啊。Natal。一千零一下是吧。这是不个false啊,为什么这是个false啊?因为你这个位置in t a呢,等于new一个in teacher括号里边括起来1000,你是不是等于谬了一个对象啊?A里边保存的是不是一个对象内存地址啊,就是A中A是个引用啊,A是个是个引用保存内存地址指向对象啊。明白吧,好,那in teacher b等于new一个inte括号,括起来还是一千八对不对?哎,那B呢,也是一个什么来引用保存内存地址指向对象,那你拗了两次啊,所以A里边保存内存地址和B里面保存内存内存地址不一样吧,A中保存的双等号,要知道啊,双等号比较的是内存地址。
09:21
比较的是对象的内存地址,A和B2个引用中保存的内保存的对象内存地址不同。啊。只有运算的时候才会自动拆箱,双等号不会自动拆箱是吗?对,是这样的啊,只有加减乘除的时候它才会拆啊。实际上双等号它不会拆箱的啊,双等号是不会拆箱的。双等号比较是对象内存地址啊,A和B2个引用中保存对象内存地址不同,双等号不会触发拆箱啊,这个运算符不会触发拆箱,自动拆箱机制啊。
10:08
只有什么呀,只有加减乘除等运算的时候才会啊,等运算的时候才会啊,知道这个来再执行一下。嗯。嗯,对吧,False吧,哎,False啊,那么这个呢,是主要给大家说一下这个自动装箱和自动拆箱的事儿,因为这个东西它比较神奇。它实际上是在JAVA5之后引入的一种新的语法,这种语法的话,为了方便我们程序员的编程而存在的一种机制啊,就是为了方便写代码,以后少写代码,但是你要知道这个底层代码还是等于new了一个,这个底层代码还是拗了一个啊,这个底层代码还是怎么着啊,哎,拗了一个。明白吧,哎,还是另了一个啊来那图上的表述其实嗯。来。
11:02
图上的表述的话,我们可以再画一下啊。整个这个呢,就是一个GM了。是不是它底层呢,有什么样方法区。注意啊,来方法区来画一下啊方法区啊,然后呢,它有这个叫做堆。啊,有这个堆还有什么呀,叫做站是不是,哎,简单画一下啊。站,那么这块的话,咱们保存一下吧,这个是直接就是对。26啊对26,然后呢,我们就叫做。In t的内存结构啊,这样去理解,那么这个方法呢?我们来看一下啊,首先它会类类加载,是不是这块我就不管了啊,类加载我就直接直接画一个得了,画一个什么呢?画一个这个in a等于1000和in b等于什么呀,1000我们画一下这个啊,实际上它等同于这个的。
12:07
各位啊,等同于这个代码和这个代码的,所以它这块呢,应该是用了两个对象,明白吧,哎,这是一个对象,什么对象引提对象。引替的对象啊,里边呢,存了一个数字多少啊,1000明白吗?哎,1000,然后这个对象的内存地址就付给了谁呀,付给了我们的前面的这个这个这个引用。啊,假如说这个呢,是我们的一个问方法。嗯。方法战争啊,没法战争行,那我们这块应该是in teacher a吧。A,是不是保存内存地址指向那个对象啊?所以这个地方有in a啊,然后等于0X1111,这个呢,去指向谁呢?去指向了我们的这个。这个对象。啊,就这个对象可以这样去理解啊,这个对象。那他再往下的话,其实相当于又扭了一个白。
13:02
对吧,那又拗了一个,那你相当于是把这个对象呃,又拗了一个全新的呀。是不是啊,六了个全新的啊六了全新只不过也是什么呀,里边写的是多少啊1000,那这个时候呢,我们在程序当中是引T什么呀B呀。啊in b,那这一块我们是不是有一个新的内存地址,这个内存地址是比如说0X2222,那这样的话,这个对象的内存地址指向谁呢?指向了这个。指向他。指向了。是吧,指向了。所以你这个A呢,要注意了,和你这个B啊,这两个变量里面保存内存地址是不一样的,你用双等号判断的是我们对象的一个内存地址,所以这个结果是false啊,这个结果是false行那行了啊,这个呢,我们就说到这儿继续看啊各位。下一个啊,来in t test06上一个例子,我们主要说的是装箱和拆箱的事儿,是吧?来我们看一下这个啊,有没有特殊待遇,大家看啊,In t X等于什么呀?哎,127,注意看啊,In t y呢,等于什么呢?一呃,127,然后接下来输出X等于等于Y,我们来看一下,然后这边呢,有一个in t AA呢,等于128,各位啊,然后in t b呢,等于什么呀,128。
14:23
然后我们输出A呢,等于等于B,那么我们来看一下这两个有什么区别,各位啊,我们来看一下啊,这两个有什么区别,一个是一百二十八一个是127,是不是来执行一下大家看啊。很有意思的事情发生了。呃,第一个是false,第二是第一个是false,看见了没有,第二个输出的结果是true。这个结果是出,那这个是怎么回事呢。这个是怎么回事呢?各位。这是怎么回事?什么鬼,这是。
15:00
为什么?分析以下程序是为什么?你猜出来?是为什么啊?第二个拆箱呢,Y的取值范围,哎,我跟大家说一下啊,负的128到正的127,这些数字在我们Java开发中用的比较多,所以这里又有又有一个常量池,各位啊,叫整数型常量池,如果这个数据没有超出BAT类型取值范围的话,这些数据会自动放到整数型常量池当中。你如果用127,用这个负的128到正的127之间任何一个数字的时候,它就不再谬对象了,听懂了吗?就Java中它是为了什么呀?提高效率啊,我说一下啊,Java中为了提高程序的执行效率啊,将什么呀,将负的128到正的127之间所有的数字。
16:02
提前数字啊,提前这个所有的这个应该这么说啊,Java中为了提高程序的执行效率,将。负的128。到正的127啊之间的。之间所有的什么呀,包装对象啊,提前怎么着。提前创建好,创建好啊,放到了一个方法区的,叫做什么整数型常量池当中了,目的是只要用这个区间的数字。啊,区间的数据不需要再拗了啊,不需要再拗了,直接从整数型常量池当中取出来啊,这样效率高一些,所以你X变量里面保存内存地址,不是拆箱了各位啊,千万别说拆箱了啊,是X变量里面保存内存地址。
17:08
和Y这个变量里面保存内存地址是什么?是同一个。这个原因结果是是为什么。原理是什么?原理是X变量中保存的对象的内存地址和Y变量中保存的对象的内存地址是一样的。啊是一样的,各位来走一个,他为了方便使用啊,他为了方便使用。啊,那其实如果是按照这种方式的话,这个图又变了,各位你看它这个数字是小于什么128的,对不对,那这个时候他怎么做呀,它实际上它在服务器啊这块进行类加载的时候,他就做这个事儿了。其实就是Java程序在进行类加载的时候啊,In这个类加载的时候就初始化这个词了啊。
18:00
来我们实际上是在这个地方又有一个池,我们这个叫做整数型常量值啊。叫整数型常量池啊,整数型常量池,那么这个整数型常量池这一块的话,它有很多这个对象对吧?啊,比如说这个对象它是什么呀,它是这个。127。对吧,哎,那么这个对象呢,它是多少啊,哎,比如说它是什么呀,126。126,然后呢,这里边有很多很多对象啊,整数性常量值有很多很多对象,然后呢,接下来如果你没超,明白吧,你没有超这个范围,他一看127没超范围,它它不在这儿扭对象了,明白吧,他不在堆当中扭对象了,他直接从池里边取的。就相当于说你在这个位置上,你是有一个叫做in X的东西,等于什么呀,0X标。
19:03
234,而你这个1234呢,指向的是谁?指向的是这个。指向的是这个对象。明白什么意思吗?啊,指向是这个对象,然后接下来你程序继续往下走,发现后边这个数据还是127,那么这个时候呢,他哎发现没有超,所以它还是0X1234,然后呢,这个指向呢,同样还是这个对象。明白吧?啊,因为内存地址是一样的,那X和这个Y现在中间使用双等号来判断的话,它判断的一定是两个对象的内存地址啊,双等号永远判断的都是两个对象的内存地址是否相同,那为什么这个地方是true,原因是我们这两个引用指向了同一个对象。啊,指向了同一个对象,各位啊,这是引提比较比较重要的一个面试题啊。
20:05
这个题目是引非常重要的面试题。啊。对对对对对对。整数型常量池里边已经有了很多对象,对,有了很多啊,你只要进行类加载,它就会有很多了,它会把这个池给你构造出来。啊,会把这个池给你构建出来。啊,这个源代码当中,看看有没有这样的东西啊这块呃,找一找。他这个老版本这块是很明显的啊,看看这里边儿有没有。应该也是有的,找一下吧。嗯。或者是负的128看看有没有。Cats。
21:02
看这个好大,看这个看这就足够了。看见了吗?Static,请问是什么东西,各位?大家看这是什么,这是不是静态代码块。静态代码块在什么时候执行?静态代码块在什么时候执行,各位大家看这个类是不是在这个类里的里边,它是内部类,而且是个私有的静态内部类,对吧。它这个in一个类在进行加载的时候,这个里边的内部类是是不是也会加载,加载内部类的时候,大家看这个地方有一个static final,最低是负的128,最高是正的127啊,然后给了一个catch。Catch是缓存的意思啊,而且是个integer的数组,看见了吧,是个数组啊,数组。然后呢,下边呢,就给了是吧,哎,这个H是什么呀,是hi吧。对不对,哎,嗨啊,127最大值最小值负的128。
22:01
嗯,然后呢,下边这个代码呢,它应该是。在这里。是不是,哎,然后I你看等于零是不是。I小于什么呀?c. Lesc.Les应该是什么?256吧。是不ii加加,然后CI这C数组I变量等于谬一个引TG加加,你看看这个能能不能看懂啊,能不能看懂这是最小值负的12128吗?对吧,其实这个代码你仔细看其实也能看懂是不是。也能看个差不多。对吧?哎,只不过就是说它是一个一个静态的一个内部类的一种方式,它这个inte这个类你在这里会用的,你明白吧,当你用这个类的时候,它会进行类加载,这个类加载的时候,这个里边静态那类也会加载,静态那类加载的话,静态代码块会执行,静态代码块执行实际上是把256个对象创建出来,明白吧,把256个对象创建出来干什呢?放到那个in teacher这个常量池当中,大家看sta这个final修饰,这叫常量池。
23:07
听懂了吗?代那个find叫常量值在方法区里边的啊,就跟杜老师讲的一样。这地方就是I这个类加载的时候。就是in t啊,T类加载的时候。嗯,会初始化整数型常量池。256个对象啊,他会全部建出来,全部建出来啊,你只要用他就从这取就行了啊,从这取出去了,有的说老师这不浪费吗?啊不浪费啊,不浪费,256个对象对于gbm来说是小菜啊,是小菜,因为负的128到正的127这些数据用的实在是太多了。在JDK8之前的版本啊,我可以确定啊,不是内部类的方式,各位不是内部类的方式啊。常量的数组叫常量池。
24:00
哎,就是个名字啊,什么迟不迟的,他就是个名字,明白吗?就是这个池就是高,听着名都高端大气上档次,这个池就是缓存。别别别别那个什么啊,别太感觉这个东西太高端了,池其实就是缓存。个。缓存啊,它其实就是相当于哎呀。什么?Catch是缓存机制。啊,缓存机制。下载吗?给大家举个例子啊,举个例子。嗯。就举我们现在,呃,我我就就就就举我们动力机电教室吧,我们动力机电教室里边是不是有很多这个,呃,这个。
25:04
桌子呀。课桌是不是?对吧,哎,那么大家想一想,大家在这个班里学习,学完之后毕业了,毕业之后呢,我们可以马上开下一个班,为什么。思考一下这个问题。为什么?因为因为我们是不是提前把这个桌子摆到了教室当中啊。对吧。会提高效率吗?提高效率。各位思考一下,想一想啊,就是说大家呢,就是我们动机点这一个班级不是有很多桌子嘛,是不是,哎,这个桌子你就可以认为它是放到这个教室里的呀,教室就相当于哎。没有带走桌子吗?桌子是放在内存当中的桌子啊,然后接下来这个班毕业之后,下个班就直接开了,我们效率很高是不是,那为什么我们效率高呢?因为提前备好东西了。提前准备好东西了。明白吧,缓存就是这样的。
26:02
你提前在内存里边准备好这些对象,你将来在用的时候直接拿,你不需要再构建了,就是这个空间你不需要再给他开出来了,听懂了吗?你不要在不需要再给他开出来了,他提前怎么着备好了。啊,但缓存缓存的优点是什么?各位缓存的优点是啥啊。缓存优点是效率高。缓存缺点呢?耗费什么内存吧?缓存它有缺点啊,它的缺点是耗费内存,优点是效率高,为什么效率高,因为不用建了呀,你不用再用的时候,你不用再把空间开出来了,这个东西你可以直接拿到拿走拿走用,所以说你的效率比较高,但缺点就是由于这些对象你是提前建好,放到那个内存里边,所以你会占用一定内存空间。啊。包括字符串为什么这么干,各位字符串为什么会有个常量池啊,字符串常量池是因为什么呀啊。也是因为这个问题嘛,缓存机制啊,大家注意啊,缓存是一种很很重要的一种机制,是一种优化程序的重要机制啊。
27:08
呃,在大大型项目当中,我们使用缓存呢,可以大大提升我们程序的执行效率啊,呃,我们可能内存弄弄得特别大是不是啊,几百G的内存听懂了吧?啊,你现在就是八个G16个G,我们几百G的内存,服务器都是几百G的内存,这个内存很大,放心啊,你可以往内存里面装东西,内存其实。优点是什么?就相当于你CPU直接跟内存交互,对吧,如果说你这个数据是在硬盘上,大家思考一下。硬盘上,是不是我们的内存还需要和硬盘进行交互啊?而硬盘是一种机械行为吧?对不对,硬盘上面是不是有磁针呀,哒哒哒哒哒哒哒磁针嘛,对吧?哎,你有机械型的行为,你的速度会很慢,但是呢,你有内存,这个内存是电流的速度,对吧,它的速度就很快啊,所以说缓存这种东西呢,它的优点是效率高,但它的缺点是耗费内存。耗费内存各位啊,占用内存行简单简单提一下啊,但是也可以提一下缓存机制啊,缓存制要重视啊,缓存机制要重视。
28:10
啊,大型项目中的重要优化手段啊,就是catch缓存机制啊,为了提高效率啊,为了提高效率。来各位就什么意思啊?我不知道大家有没有理解我在说什么。好大家都知道啊,我们访问一下京东。他京东首页上的这些数据有没有可能都是在缓存里边存着的,有没有这个可能,各位你比如上面这个这个这个图片,就这个图片有没有可能是存在缓存里边的。这些信息有没有可能都存在缓存里边,为什么访问京东手机E就出来了?如果说你这些东西没有在缓存里边存着,你从直直再从数据库里边捞,捞出来之后再展示,你用户群的并发量又这么大,你能这么快展现出来吗?当你展现展现的过程当中,这个页面都白了两三秒,三四秒了,客户都把浏览器窗口关了还有啥用啊,所以你为了留住这个客户啊,你必须让你的这个门户的首页,就咱不用说别的,你门户上的这个首页,你最起码的反应速度要快。
29:26
对门户的首页,你的反应速度要快,听懂什么意思了吧,所以啊,这个东西可能会会进行优化啊,在优化的过程当中呢,它肯定会使用什么呀,诶我们所说的缓存机制,而这种缓存可能是提前备好放在内存里边。我们将来访问的时候,直接从内存里面拿,就不需要再从底层数据库里面查询了,也不需要从硬盘上交互了,就这意思啊,好,这是缓存,各位啊,缓存。
我来说两句