00:01
好了,同学们,咱们开始上课了啊,我们首先呢,先来看一看这个咱们昨天在最后的时候,我们说了什么内容啊各位。我们在最后的时候呢,说了一个这个八种基本数据类型所对应的一个包装类,对吧,那么这个包装类这块的话,咱们写了几个例子啊。首先第一个例子是什么呢?大家要注意好,大家那边没问题吧,能听清吗?有没有问题?喂喂喂。没问题是吧,好,那么咱们就继续啊,继续那么咱们。好嘞好嘞好嘞,可以啊呃,咱们这个包八种基本数据类型所对应的包装类这一块啊,咱们的首先第一个要理解,理解什么呢?理解我们这个包装类有什么用,就是说八种基本数据类型还不够用吗?为什么要再提供八个包装类型呢?为什么再提供八个object呢?这是因为啊,我们为了方便我们的开发,因为当一个方法的参数如果是object类型。
01:14
如果没有这个八种包装类型的话,你只有基本数据类型的话,那你基本数据类型100,你是没有办法传到这个do some方法当中的。你100是基本数据类型啊,你do some方法参数这个object呀。是不是,哎,所以这块呢,为了方便我们的开发,所以在这里呢,定义了什么呀?哎,我们的一个包装类型。包装类型其实就是一个类,这个类的继承object,然后它的参数呢,或者是属性啊,有一个value。对吧,这个就是那个被包装的那个值嘛,这个int类型现在包装成my int了。对吧,将来这个100放进去是不是,哎,你想传这个100进去啊,你不能传100对吧,你可以传什么呀,传一个my in这样的一个对象,用出来传进去就可以了。
02:01
所以这个呢,要理解咱们为什么要使用我们的包装类型。啊,为什么使用包装类型,那么到第二个例子这一块呢,我们主要是给大家列出来八种基本数据,数据类型都是什么东西,对不对?然后呢,我们给大家列出来八种基本数据类型锁定的包装类型,每个类型的名字叫什么。是不是,哎,大家看一下啊,这个名字我不知道大家有没有记住,我们说了以八种基本数据类型对应的包装类当中以T为代表去讲解,然后剩下的我就不再讲了啊,照葫芦画瓢大家就行了啊,照葫芦画瓢就可以了。另外呢,这八种包装类型当中,其中六个呀是数字,那么这六个数字呢,大家要注意了,我们六个数字啊,它的附类啊叫number number这个类当中啊,有这么几个方法,什么bit value啊,Double value float value value long value,还有short value是吧?这几个方法实际上是把我们的包装类型干什么呀,再变成我们的基本数据类型,你只要是把这个对象造出来,你想把它转成数字的话,你调这个value方法,如你这边是调要你调这个short value这个方法是不是,哎调用这个方法就可以怎么着啊,哎,转换成short基本数据类型,如果你是调用它的int value这个方法,就可以把它转成int类型,这个过程我们叫拆。
03:27
啊,拆箱在这里呢,我再主要给大家说一下这个地方啊,我们创建一个integer,可以通过new一个integer传个123也可以什么呀。啊呃,这这这边是这样啊,创建出in对象之后,这是一个包装类对象吧,然后呢,调用它的float value转成float,调用它的int value可以给他转成什么int类型的数据啊,其实是这样的一个方法啊啊大概呢,有一个印象啊,这个也很好理解对吧?啊呃,像这种通过构造方法new的这种方式传进去,这叫装箱。对吧?哎,然后呢,通过in value这个方法调用呢,你看这个I嘛,是不是调这个int value这个方法,它的目的是不是是为了这个拆箱嘛,啊拆箱啊,一个是装箱的过程,一个是拆箱的过程,其实装箱就是基本数据类型转换成引用数据类型,拆箱的话,其实就是引用数据类型转换成基本数据类型。
04:19
啊,好,这是这个例子啊,第三个例子,这第三个例子是什么呢?是关于in teacher类当中的构造方法,它有两个,一个构造方法呢,是直接传一个int类型的数据,就装箱就行了,还有一个构造方法是什么呢?哎,是传一个双引号括起来的字符串是吧,也可以给它包装成什么呀?啊,Int类型啊,In teacher类型,那我们其实啊,我说了八种包装类当中,我们重点讲这个in teacher,那其他的你可能也能照葫芦画瓢画出来,你比如说这个构造方法它是有这么两个是不是,那你应该能想象到double它也有这么两个构造方法,你看。Double的构造方法是不是传一个小数啊,是不是这个小数是一种基本数据类型啊,是不是包装了呀?哎,还有一种方式是不是双引号括起来字符串也可以采用构造方法的方式给它创建出来吧?哎,所以说通过这个inte的构造方法,我们可以推出其他类型的构造方法。
05:12
对吧,你看他构造方法怎么写的,这个构造方法怎么写的,对不对,到了我们第四个例子之后啊,在这块呢,主要是跟大家聊一聊什么呢?哎,聊一聊这个。咱们叫做什么呢?叫做这个,呃,通过这个integer啊,它的max value啊,还有它的mean value啊,还有它的max value,还有这个mean value对吧?哎,像这样的inte的BA,像这种方式,我们一般通过访问常量的方式,我们可以获取到它的最大值和最小值,这个作为了解内容啊,最大值最小值这个东西,呃,怎么说呢,用很少用的很少啊,呃,即使我们不知道这个常量。我们点过去啊,看一看。你看public sta final是不是T,是max value,你看这是什么?
06:01
这是咱们的int最大值。是不是这个是印的最小值吧?0X16进制对不对,16进制的方式表示的啊,采用这种方式。好,他都改了啊,JDK13这块改的挺多啊,JDK8的话,它其实就是直接就是最大的值就是就是2147483647啊,最小值其实就是写死的啊,现在它变成这种方式,它的目的可能也是效率问题吧。啊,效率问题啊,16进制的一种方式啊,行这个无所谓了啊,这是最大值最小值,我们昨天其实还说了一个什么呢,说了一个这个自动装箱和自动拆箱,但是我把那个程序删掉了。因为当时录视频的时候呢,出了点问题是吧,哎,我们昨天其实就说到这儿了啊,当然咱们昨天还说了一些别的,比如说string这个类。String这个类啊,String这个类这一块的话,大家要注意咱们这个字符串啊,它是一旦创建之后啊,用双引号括起来这个东西啊,它是不可变的啊,你要知道这一点,当ABCDEF从出生到最后死亡都是一个ABCDEF。
07:10
它并且存储在什么呀,存储在我们的一个叫什么方法去的字符串常量池当中啊,字符串拼接呢,会导致新的字符串对象产生啊,新的字符串对象产生啊,New string的话,那就不一样了,New string它。不止这个是在这个常量池里边有一个,而且在堆里边还会有一个对象啊,实际上就相当于这个是有两个对象,一个对象是字符串常量池里边的,还有一个对象是什么呀。哎,还有一个对象是我们的一个这个堆里边的啊,扭出来的在堆里边的存的对象啊。那么在第二个例子当中呢,我们说的是什么呢?说的其实就是相当于是我们这个。啊,也是相当于这个双等号和ES的事儿啊,就是说我们判断比较字符串是否相等,像这种情况下你是可以的。对吧,原因是你这个hello和这个hello啊是同一个hello在那个内存存储方面是一个对象,所以S1里边保存的内存地址和S2里边保存的内存地址是同一个,所以双等号是没问题的,对吧?啊没问题的,但是呢,这个不是很保险,因为字符串这个东西到底你是怎么建出来的,我不知道,你有可能采用这种字面量的这种方式,也有可能采用new的这种方式,如果你采用new两次的话,那XY它有采用双等号的方式,就是false了啊,因为你这个对象创建出来之后啊,它对象的一个内存地址啊,保存到X里边,这个对象又用了一个新的呀,对不对?哎,保存的一个内存地址放到什么呀,Y当中双等号判断的是内存地址,所以这个是false,应该用equals方法,大家注意啊,S1里边保存的并不是hello啊,S2里边保存的也不是hello啊,S1和S2里边保存的是hello,这个对象在堆内存当中的啊,不是在堆内存在方法区常量池当中的内存地址啊,放到了S1和S2里边,记住双等号,永远判断是引用的话,判断引用它的内。
08:59
地址啊,就是一。
09:01
里边保存的内存地址和S2里边保存的内存地址啊,是否相同,那么判断字符串呢,就用ES方法,大家要对这个有点印象啊,ES方法但是这里有说了一下,这样写可以避免什么呀,空时异常呗,这样写会比下边这个好啊,你你可以如果有机会的话,你将来开发啊,如果碰到像这种情况,一个是变量的情况,一个是纯字符串字面量字面值的这个情况。对吧,你像碰到这种情况的话,我建议你把字面值啊能往前写,写到前面啊,这样的话可以避免空指针异常的啊,空指异常,那么这是我们的string的两个例子,第三个例子呢,我们基本上在这儿呢,就相当于是有一个面试题,创建了几个对象是吧?创建了这是这是方法区常量池里边有一个对象,另外对里边有两个,是不是三个对象啊,那么第四个例子呢,最主要是告诉大家string这个类啊,它的构造方法有多个,是不是通过这种方式呢,可以创建一个字符串对象,通过这种方式呢,也可以创建一个字符串对象啊,通过new差数组的方式,差数组一部分的方式,BY的数组,还有bad的数组一部分的方式,都可以把字符串对象创建出来,这是字符串的构造方法,到第五个例子当中,我们来看一下啊,第五个例子当中呢,我们就是讲了20个方法了,各位啊,这20个方法我在这里就不再回顾了,你下去之后呢,多敲多练啊,只有你下工夫敲练哎。
10:25
第一遍敲的时候怎么着啊?哎,你照着那个API文档来第二遍敲的时候,我建议怎么着呢?哎,我建议你啊,别看文档了,你尝试一下什么呢?21个啊,你尝试下什么呢?尝试一下就是这个字符串,哎,写完之后啊,你在这个位置点一下。点了之后呢,后面不是有很多方法吗?对吧,哎,你从头试到尾,你猜一下对吧,猜一下啊第一个啊是啥来着,是不是,哎再往下还有这个,哎,Replace是干什么的,Get是干什么的,对吧?我觉得这个东西呢。
11:00
你第一次呢是用什么呀?用API的帮助文档,你再往后如果敲的多了,我觉得你这个文档因为太常用了嘛,方法你都接触的N多遍了,是不是你就可以采用idea的点的方式,哎,它点出来明白吧,点后边这个方法你认识不认识,哎,你看到这个方法,你不看任何文档,你能能不能猜到这个方法是干啥的。啊,如果是这样的话就完美了啊,你就可以可以出出山了啊,就这意思。好了,那这是我们所说的这个,嗯,String这一块,各位啊,再往下的就是string buffer和string builder了,那么string buffer这个东西,它其实也是个字符串,只不过它是它是它属于什么字符串啊。它属于这个可变长度的字符串。就这个字符串表示可变。你前面咱们讲过的这个string这种东西啊,它是不可变的。你双引号括起来的这东这个东西。啊。
12:01
它里面的东西不能变,明白吗?哎,不能变啊,一旦创建就不可改变了。String buffer呢?String buffer其实底层它是也是一个BY的速度,和我们的string是一样的。他原原因是因为我们这个啊。嗯。String这个类呢,它里边确实是一个也是一个bad数组,但是呢,它是前面用了final进行了一个什么呀来修饰,那么就表示呢,我们这个value呢,一旦指向一个数组之后呢,就不可再指向别的数组了。记住啊,你在跟面试官聊天的时候,千万别说别只说一个final啊,你如果只说final,人家面试官问你字符串string为啥不可变?你说是final的好,我们大家这样回答对不对?就注意事项,我说就是面试官问了。为什么呀,为啥是不可变的?
13:03
啊。你说你说你说润润润里边有个final。你这样回答对吗?这样回答面试官啊。他会认为你说这个string啊,它是final修饰的,然后string类不能被继承。是不是,哎,你给他说清楚,你这么说,你说呀,死顺这个类啊,我看过源代码,就你懂这句话吗?就是说死顺这个类啊,我看过源代码。明白吧,这句话要说上去啊,这个string类中有一个什么呀?BY数组。啊,拜的数组。并且这个bit数组是使用什么呀,Final修饰。明白吗?哎,你要把这句话给他说清楚。明白吧,哎,你把这句话说清楚,你不要只说一个final,你说final,它认为你是string,是被final修饰润,被final修饰充其量就是不能被继承,它不能说明它不可变,你得说清楚它里边是BY数组,然后被final修饰。
14:12
BY的数组被翻的就是。啊,是这样的,那你的string buffer这一块呢,哎,我们可以点过去看一下,那么这个其实也是被final修饰,只不过呢,我们string buffer它里边这个BY数组啊,它不被final修饰,我们可以看看它的构造方法,掉下负类的构造方法往上走,大家看这个bad数组是不是并没有使用final修饰啊。是不是你得把这个问题给他描述清楚啊,问题描述清楚啊,这块呢,我我我再补充一个吧,补充一下啊嗯。补充到哪儿了,我看看啊。嗯。String buffer。TEST01020304STRING8分TEST04啊,我在这补充一下啊。
15:02
扩展一下的。就是面试题对吧,他说为什么。为什么是不可变?你可以这样说,就是说我看过源代码啊,我看过源代码就是这个string类啊中有一个什么拜的数组。啊,这个bit数组啊,采用了什么呀,Final修饰。因为什么?因为数组一旦创建啊,长度怎么着不可变。啊,因为数组一旦创建长度不可变。啊,并且被什么呀,Final修饰的,这个修饰的。引用是吧,一旦什么指向某个对象之后。不可再指向什么呀,其他对象。
16:04
所以死顿是不可变的,所以死啊是不可变的。啊,就是什么呀,ABC。无法变成什么呀,啊,无法变成这个abcd。啊。那么这是第一个这个面试题,面试题。那么string builder或者是string buffer为什么是可变的呢?就是你还可以说对我看过什么呀,哎,原代码你要把这个说上去啊,这样你工资稍微高一点明白吗?哎,工资的话可能就是14K15K之类的啊,可以达到这个级别啊,你就可以说看过原代码是吧,这个STRING8分或者叫string什么呀,Builder啊,内部实际上是一个什么呀?哎,内部实际上是一个这个bit数组啊,这个bit数组啊。
17:09
没有被什么呀,Final修饰啊,没有被final修饰当什么呀,这个string buffer或者是string builder的初始化容量啊,我记得啊,应该是16啊,你不用你不用说的那么那么精确对吧,应该是16啊当当存满之后啊,存满之后会进行什么,会进行扩容。啊呃,底层调用了什么呀?数组扩容的方法啊,数组拷贝的方法,拷贝的方法啊叫system every copy啊every copy。呃,是这样扩容的啊,是这样扩容的。啊,所以builder啊,Buffer。
18:00
适合于使用什么呀,字符串的频繁拼接操作啊,频繁拼接操作。他钝就不行啊,钝就不行。那要注意这个这个这个这个事儿啊,行了,这算是回顾吧,啊,简单回顾一下,这这个课堂上看了这些源代码,我觉得大家呢,还是要有一点点印象啊。那么现在有个段S等于ABC,各位这个说字符串不可变是这个意思吗?S能不能变成XYZ?能不能?行不行?字符串不可变是什么意思?字符串不可变是什么意思?是说双引号里面的。字符串对象一旦创建不可变吧?
19:00
一旦创建啊,不可变。明白吗?你S能变呀,你S有没有被又没有被final修饰,你如果被final修饰,S不能变。是说你ABC这个不可变。明白吗?啊。是说你双引号里边括起来ABCS是可以指向别的的啊,S变量是可以指向什么呀,其他对象的。没问题啊。字符串不可变,不是说S不可变啊。字符串不可变,不是说以上变量S不可变啊,说的是双引号ABC这个对象不可变,你别理解错了啊。别理解错了,你有的同学就是啊,这个string不可变,这S等ABC8X等于XYZ,这不字符块变了吗?这理解你这样理解就错了,不是那个意思啊,不是那个意思,对,就这个不可变是什么意思,你好好想想啊,不是S不可变,是说你等号后面的这个对象,这个对象一旦创建是不可变在字符串常量池里边的。
20:19
啊,就是ABC放到了字符串常量池当中。啊,包括这个不可变啊ABC不可变,对就这意思同样一样。这个XYZ呢,也是放到这种常量是XYZ不可变啊,XYZ不可变,你你你搞清楚啊,搞清楚是谁不可变啊。行吧,那这个呢,哦,对,还有一件事,就是string buffer和string builder。Barber builder各位啊。嗯,这个。他这个哪个是线程安全的,还记得吗?String buffer线程安全的,String builder是非线程安全的,这个要有一个印象啊,在string buffer里边是不是有很多方法都是加这个synchronized呀。
21:05
Synchronized是不是?哎,Synchronized这个单词还记得吧?哎,叫string buffer吗?这个类里边不有很多方法吗?是不是?哎,这个方法看看是不是都有synchronized呀,Synchronized synchronized表示同步啊,这个在多线程的环境下,这个类是线程安全的啊,String buffer是线程安全的,其中这个string builder呢,是非线程安全的,这两个以后怎么选,我们到讲了线程之后,我才能给大家讲,现在的话大家先有一个印象就罢了啊。行了,我们就回顾到这儿吧,这是昨天的内容。
我来说两句