00:00
好,那刚才呢,咱们是讲了这个自定义泛应类啊,这个泛映方法怎么着使用是吧,相关的一些注意点了,然后呢,我们再举个例子啊,现在给大家说一下,在什么样的场景下,我们会去自定义泛型类和泛映方法多少呢?我们写个例子让大家感受一下这块我就把这个例子呢就写到这儿了啊这个我们呢,先新建一个啊,从我们后边应用上来讲呢,后边我们会写一个类呢,这个类呢叫做do。啊,一般呢,我们就念成DA了,很少呢,你再翻译成写个倒类是吧,诶倒类啊,这个有时候念成道,但也比较少啊,DA呢,相对来说大家更习惯一些,这个DA是什么呢?稍微的说一下。就是以后呢,咱们写这个单词也好啊,凡是呢,是这种缩写的这种啊,一般呢,我们就都写成大写了。啊,一般的都写成大写了,你比如说咱们后边讲的这个蛇口是吧。哎,就一般的都是这样写,你说这样写行不行呢,倒也行,但是一般的习惯上都这样写,因为呢,它是几个单词的缩写。啊叫sru structural query language啊叫结构化查询语言,这个呢,就我们学习数据库的时候呢,要学习这样一门语言,OK啊,哎,这个do呢,它也是单词的这个缩写,它呢对应的呢叫data,或者呢也可以看到这叫dataa呢就是CE。
01:13
啊,然后呢,O呢叫object。叫数据或者叫数据库访问对象啊,说白了什么呢,就是我们把操作数据库的这个相关的方法呢,生命在我们当前这个do这样一个类当中。啊,就这个意思啊,说内部呢。哎,说。内部。诶封装了啊,操作数据库啊相关。哎,表的。哎,增删改查操作。啊,一般呢,我们针对数据库中的这个表呢,做的操作呢,就是增删改查了,诶这个增删改查的话呢,我们习惯上又称为呢叫c rud啊。啊,这个C呢叫create,你可以理解成就是新增的意思啊呢retrieve就是检索的意思,就查询update delete啊,就是增删这样的几个操作了,啊好,那这个呢,我们刚才提到了,就是来操作数数据库中相关表的一个增删改查了,注意这块呢叫相关表,没有说明是哪一张表。
02:11
也就是说。啊,比如说我们这块呢,使用一个客户端啊,我来联系一下MYSQL的数据库服务器了啊,连上以后的话呢,我这个T这个数据项,注意这里边的每一个都是一个数据库了啊这个数据库下呢,我就放了一些表。然后呢,比如说我们把这个表打开,这是一张表,针对于这张表呢,我们可以做增删改查的操作,下边这个表都同样的道理。那既然呢都是增长改查,其实整个呢,操作的套路呢都是类似的,区别呢就在于你写的SQL语SQ的这个语句呢,是不一样的啊,那既然呢这个套路类似,咱们不妨呢,就写一个do这样一个类得了。但是写这一个类的时候呢,大家想想啊,增删改查,咱们就以查来说吧,查的话呢,就是我们查表中的一条记录,查完这条记录呢,回到咱们Java层面。咱们章里边讲叫面向对象是吧,这里边儿呢,又引入这句话呢,叫万事万物皆对象。
03:06
就是在我们这个数据库里边呢,我们这里边儿呢,横向来看,这只能说呢叫一条记录了,但是在我们这个Java层面的话呢,这一条记录相当于是。是不是又一个对象呀?对啊,所以呢,回到我们这个Java这个代码层面的话呢,我们这个增删改查这个查呢,咱们就希望呢,它呈现出来的是一个对象了。那这个对象呢,现在问题是类型是啥。是吧,你说类型,哎,这个咱们这个表呢,有一个类型,这个表呢,叫S这个表。这个表呢,回到咱们Java这个层面呢,咱们倒是可以提供一个类跟它对应是吧。比如回到回到我们这个Java代码层面啊,咱们这边也是体现了叫万事万物接对象嘛,比如说呢,现在呢,我们在Java咱们代码层面呢,我提供一个类,这个类呢,叫做customer这个类。啊,这个类呢,跟咱们这个表呢,有个对应关系啊,你看咋对应啊,这个表里边呢,我们会发现呢,是不是有几个列呀。
04:05
这个列的话呢,这个ID和photo,那其实回到咱们这个Java这个层面呢,相当于我们Java这个类里边的什么呀。对,其实是不是就是属性啊。所以呢,我们这个customer呢,你看我设计它的这个内部结构的时候呢,我就不写权限了啊,我就提供一个性的ID。提供一个string的name,这个ID呢就跟这个ID对应,这个name呢就跟这个name对应,然后哎死string类型的一个,比如叫email是吧。然后后边呢,还有一个叫date类型的,比如叫birth了。这个date呢,咱们前面也稍微提到过,是不是用这个circle下这个data对应就行是吧。诶就可以了,好,这个photo呢,它是一个具体的图片啊,这个呢是在我们这儿是个lo类型的,回过来的话呢,我们得用一个file呢去接,File的话呢,咱们是L流里边再讲,所以这个我先不管它啊好这样的话呢,我们就有这样一个对应关系了。啊,这个对应关系呢,其实啊,咱们后边呢,也会讲到数据库的时候会说啊,他这呢,其实一个叫哎,对象关系映射叫OM的一个思想。
05:04
啊,一说的感觉还是有点高深了啊,这个O呢叫做object,二呢叫relational。Relation啊,然后卖M呢叫map,或者我们也翻译成叫mapping啊,对象关系映射什么意思啊,其实这个事儿呢,很简单啊,就是我们呃,数据库中的一个表。哎,它呢,是不是与我们Java中的一个类对应。哎,像我们刚才说的这个叫customer这个表跟我们这个类呢去对应了,好,然后呢说呢表中的一条记录。哎,它呢与我们是不是Java类的一个对象对应。Java中的一个类,这个我写错了是吧?表呢跟类对应,表中的一条记录呢,与Java类中的一个对象呢对应。啊,然后下边呢,是表中的一个字段。
06:00
这个字段呢,就是我们对应数的这个,你也可以呢,列成了叫一个列是吧,它呢是与我们知道吧。啊类的一个属性,或者我们这儿呢,是不是也可以叫字段啊。来对应。哎,这呢就有这样的对应关系啊,那以后呢,我们,哎,比如说有这个表了,那我们这个类呢,怎么去设计呢?哎,我们就可以呢,有这样的一个对应关系啊,有这样一个思想呢,去指导我们去设计这样的一个类。啊,这呢就是这样的一个对应关系了啊好,然后这呢是一个表了,那我们这里边儿呢,是不是还有别的表。比如就我们这个表为例啊,回过来那这个表的话呢,回到我们Java代码层面,如果呢,我们想针对这个表做一个增删改查操作,尤其是查查的时候呢,我们这儿呢,是不是也应该对应着一个类是吧,这个类呢,比如我们也就叫做这个order类了。好,查询的时候呢,我们希望它返回的是个order类型的一个对象了,那对应的这个属性呢,也是依照刚才说的OM这个思想啊,我们可以设置成int类型的叫。ID是吧,诶string类型的叫。
07:01
然后date类型date。哎,这么着,然后这个呢,Out加个回车。哎,这么着是吧,好,其他的这个构造器呀,方法呀,我就暂时先不写了啊好,那大家也看到了,它俩是对应的,然后呢,诶这两个呢是对应的。那这样对应完以后的话呢,现在我们针对于表呢,这个或这个做增删改查操作,所以他们的操作呢,整个套呢又是类似的,我就想到写到这一个里边了,但写到这一个里边呢,咱们刚才提到了增删改查查这时候就涉及到呃,对应到我们Java这个层面的这个类型不一样了。那你如果不用泛行的话呢,我们只能说呢,返回的是一个object类型。只能这样了是吧?哎,那要是我们能够用上泛型呢,我说呀,这个位置我就可以写成是一个T了。诶,我就这样来去处理好这个写完以后的话呢,下边我们就可以写这些增。啊,你看这个山。哎,改茶这样的一些方法。
08:00
啊,因为呢,大家的套路都一样,所以我们就写到一个这个类里边了。哎,查是吧。OK,行,暂且呢,我们就先写成这样好,比如说第一个叫增增的话呢,你可以理解成呢,我们想把Java代码层面的一个对象啊,把它呢,写入到我们对应的这个数据表当中了,那我们就可以这样啊,Public VO是吧,咱们这个就叫A或者叫insert啊都可以啊。这个呢,增增的话呢,我们实际上呢,是有一个对象的,这个对象呢,就是T类型的一个。诶,我们叫一个B也行啊,就这样一个对象,然后把这个Java代码层面的这个对象啊,诶我们通过DA的调离方法的时候呢,比如说你传过来的是一个customer了,里边呢,你就相当于写相应的S语句,把它写入到我们的这个数据库里边。啊,这个我就略了啊,哎,通过呢,相应的这个,哎,我们说SQL语句是吧,哎,将咱们这个B对象的这个属性值写入到数据表中是吧,当然这个表的话呢,你如果这个T呢,是一个customer,我们就写到这个表里,你要是一个order的对象就写到这个表里。
09:03
这都是这里边儿呢去处理的问题了。行,这个就完事了啊,下边这个删除。Y,比如我们这个叫delete by,通常我们删的话呢,都是按照ID来删的,这呢我们就可以写一个int型的一个ID了。哎,这样呢,就是删除的这个细节,咱们也同样的就略了啊,当然了,你说想删指定这个ID对应的那个数据的话呢,你想删完之后还把这个数据呢呈现给我们,如果你有这样需求的话呢,这块你就再把它返回一下就完了。啊,这个暂时我们写个略,哎,先写个return吧。这样的思路啊,好修改,比如public word,我们来一个叫update修改,修改的话呢,一般呢,我们就习惯上通过ID去修改啊,我想把这个表当中呢,哎,比如说ID是诶五的这个呢,值给改一下,后边这个值改成什么呢?就改成你传进来的这个对象的这个值。哎,比如说这呢,写一个B啊。哎,这呢,就是一个具体的修改的细节了。这些你就传一个T就可以了啊,具体的细节的话呢,同样的哎,我们还没有讲后边这跟数据库的操作啊,这个我也就略了好查询。
10:07
查询的话呢,这呢其实可以分成两种情况,第一个呢,就查这个表中的一条记录,所以我们返回的呢,就是一个对象。哎,这个我们就可以理解成叫,或者我们这个叫query也行是吧,Query呢,For一个。Instance。啊,In就是实例的意思了啊。影视。是吧,好,我想查这个表中呢一条记录,那我们这块呢,就这样呢,去写一个查询,查询哪条记录呢,比如说指定这个ID的这条记录返回一下。啊,这个呢,细节我们也给略了。OK啊,这个呢,我就先哎return now了,这呢是查一条记录,然后呢,你也可以呢,查这个表中的多条记录。多条记录的话呢,我们返回来,那就多个对象构成一个list吧。可以这样写是吧,比如呢,Get for,或者叫query是吧。For一个list。
11:00
哎,这么着是吧,比如说你想查询啊,比指定这个ID大的这些数据都有哪些,比如ID呢,大于二的,哎这呢就有好几条,然后把它封装到一个历史当中,给我们返回一下。啊,这个我就先return一个闹了。啊,这个相当于是呢,叫呃,查询异巧记录。这个呢,就是查询多条记录物构成的一个集合。哎,这样就可以了。好,那这儿呢,我就简单的把这个大体的这个块儿呢列出来了,哎这儿呢,就体现出来,我们这有一个诶类的这个泛型啊好,那么针对于咱们具体的这张表,或者是这张表的话呢,咱们可以怎么办呢?你看我这样去处理啊,我现在呢,再去写一个,比如说就叫做customer这个deal。哎,我让这个do呢,去CE这个Du,然后在这个位置呢,我指我就是customer。就这样了啊哎,然后呢,此时我们这个类呢,注意它不是一个泛型类是吧。呃,然后呢,下边你看我们去写这个do的这个测试哈。
12:02
诶,这个单元测试第一个啊,这个时候呢,我们就一个customer do啊,我叫DO1啊new一个customer do,好这个完之后呢,大家你看啊,我们这个do一点,我想做一个insert这个操作,你发现这时候是不是只能操作customer。是吧,诶这个呢,你看哎,我就简单这样写一下了啊,我就只能够去操作这customer了,包括呢,我们这个do点咱们呢叫query for instance,这我写个一,咱们这会查询到的呢,它也都是一个customer。啊,这个处理的类型看它都是非常的直接的啊,都是具体的类型,然后呢,如果你要操作这张表的话呢,我们这儿呢,同步的咱们再去来一个叫order deal,让他呢去继承这个deal,同时呢,我指定这块我只能操作。哎,这么着,然后呢,回过来,哎,你在这个位置上去处理的时候啊,这不就类似了吗。这我们叫order do,然后呢,来一个do。哎,New一个deal。好,那这个do呢,我们同样的哈,比如我们做一个insert,这个时候你只能是往里边放这个order。
13:05
不能放别的类型。诶,我们就能够很好的去控制呢,它相关的这个操作来查询多条记录,诶大于一的这条记录返回来,你看也是一个。哎,Order相关类型的这样一个例子。哎,这是这样的一个思路啊好,这呢就体现出来了,我们这个所谓的不确定的部分,我们又用一个泛型类啊去进行控制,你要没有它的话呢,这块我们只能是写成object了。那显然呢,就是太。太通用了不合适啊,包括呢,我们这块在处理的时候呢,这个呢,我们再往里边去做一个erl添加,这是object类型,那明明它处理是order这块呢,你写成一个别的类型的也不合适。所以我们用发型类呢就比较合适。好,那么这里边儿呢,能不能有一些泛型方法去体现呢?我说呀,也可以。啊,比如我们在后边呢,我去叫来定义这个泛型的这个方法啊,这个泛围方法什么意思呢?比如这块我定义一个啊,这个呢,我们假设呢,还有返回值类型,那就是E了啊,这个我们叫获取具体的某一个Y6。
14:04
啊,这个呢,其实我们就可以写相关的这种SQ语句了啊,去做这个事儿,然后这个位置呢,我们就。指明了你是一个泛型方法了。哎,就这样来写,哎,大家可能会想说,诶,这个呢,有什么具体的场景吗?啊,有是吧,比如说。不管你是这个表也好,还是这个表也好,咱们现在这个呢,是个通用的操作某些表的这个方法了啊,那我比如说啊,我想查询这个表当中有多少条记录。哎,那这时候呢,我就用这个方法了。那有多少条记录,那这时候大家你看我们这个反物质类型,这个E是个什么类型啊。Int类型不对。对,你要说的话呢,应该说integer是吧。对,因为呢,我们这个泛型参数呢,是不是只能用。类类型的是吧,所以你不能使用基本数类型,所以要说的话呢,也得是说in。啊,实际上的话呢,也不对,是一个long类型的,注意是这个大写的这个LR包装类的这个long,因为呢,这个表中的记录呢比较多,所以我们查询完以后呢,它是一个浪类型的。
15:10
好,那这块我们就比如说,哎说查询。哎,表中的哎记录数,哎,大家你看啊,我们这个表中的记录数呢,它的反它这个对应的这个E呢,它相当于就是一个long类型是吧。这个类型的话呢,跟我们上边这个T是不是没关系。啊,没问题,好,再比如说啊。比如什么呢?我们查询这个表中,这有一个列呢,叫做birth birth呢是一个date类型啊,我们想查询最大的生日。查询啊,表中的。表中啊,最大的这个生日,那这时候的话呢,你看它这个意呢,又相当于是我们这里的。是不是就date类型了。对啊,就是它这个类型呢,又不确定了。OK啊行,当然了,还有其他的,比如说最大的这个字符串啊,当然这个也有可能哈,那又成了一个死顿类型了,所以呢,我们看到就是这个E的类型啊,跟咱们这个T呢没什么关系,所以呢,我这就是一个独立的泛行方法,泛型方法我们也提到了,说它的这个泛行参数呢,确实跟上面的T没关系,包括你这个类是不是泛行类都没关系。
16:18
啊,就这样个场景啊,行,这个呢,就我们说的这样的一个方法,当然有不确定性,这个你可以在我们当前这个,或者你再去定义自己的,比如我就想求这个记录数,我就想求最大的生日,在相关的方法呢,你再去调福利的这个方法。啊,去去执行就可以了啊好。这个呢,我们就给大家举了一个泛型类和泛映方法呢,我们在开发当中的一个场景啊,自定义的这种场景呢,有,但是相对来说还是要少一些,更多的呢话呢,我们都还是使用类似于像集合当中一些都定义现成的一些API了,我们直接用就行。好,那么关于自定义翻译类翻译方法呢,咱们就告一段落了啊,下边咱们看一下课后的几个练习题啊,大家呢看好不好写啊,诶第一个这个题的话呢,其实跟我刚才举的这个场景有点像哈,这个呢它也叫做这个do了,操作的这个类型呢,那也不确定,只不过呢,这个题里边呢,我们不涉及到跟数据库交互了,咱就是纯是Java代码层面的一个在内存当中的一个存储了,所以这块呢,提到了一个map。
17:15
那我们下边把这个题呢,可以做一下啊,首先呢,它让定义一个反应类,其中呢,定义一个map类型的一个成员,变量键呢是string值呢是T类型啊有下边下边一些相关的这种方法,哎,那我们这块呢,就定义一下这个Du了。啊,在这儿啊。哎,新建一个叫。哎,这么着啊好,关于他的这个描述呢,就粘过来。诶,这个大家下来的话呢,把这道题可以写一写啊,这个题呢,其实还挺好的,作为一道挺基本的,包括啊用到我们集合中的一些操作了啊。好,他要求我们这个类呢,是一个带翻型的了哈,行没问题,下边呢在其中声明一个map的成因变量map的键是string,值呢是T类型。
18:01
也没说叫啥名啊。咱就map一下,就叫map吧。呃,也没说有没有去初始化,都没说,光说了他的这个泛型了啊。这是一个string类型的一个。啊,这个是K哈T类型的一个value是吧。也就这样了。行也没说那个权限行,暂时的话咱们就写成这样啊。好,接下来的话呢,主要让我们提供这样的几个方法。那咱就一个一个来呗。先看第一个吧,它这是这样的一个作用啊。说呢,保存T类型的对象到map的成员变量当中,这呢是string形的I dt类型的一个nity,这正好是一个键,一个值就放到我们的map里边就行了。哎,可能大家直接就N就map就put就完了是吧,ID扔进去NDT扔进去,哎是不是就可以了。诶,当然那玩意你小心一点啊,咱们当前的这个对象,如果你有个对象去调它的时候呢,Map是不是no啊。对,就是在调离方法之前呢,一定要把这个属性呢,得初始化一下是吧,目前的话是没有的啊,这个咱们一会儿看看在哪初始化,先小心一点,先写成这样了,然后第二个。
19:09
啊,CTRLC。这么着啊LC啊,这个map ID。啊,其实这个比较简单,这些就相当一个get呗。诶拿过来,你要有就有,没有的话那就闹呗。Return一下是不是就行了。嗯,OK啊好,第三个。这个呢,相当于是个修改了。他呢说替换map中PVID的内容改为NT对象。啊,这呢,都不是操作数据库的啊,咱们就纯粹操作内存中的一个map了,说把这map里边呢,呃,指定的这个K的那个值呢,改成它。相当于就是修改是吧,修改在咱们map里边呢,是不是也是铺的呀。
20:01
Idtt是吧?写到这儿的话呢,你稍微的你小心一点哈。就是你说我万一要是这样就写了啊,假设呢,我们这个map当中没有这个ID。那我要调这个方法呢,这成啥了?是成千家啦。对,那其实跟我们这个题面呢,是不是稍微有点不太相符哈。也就是说呢,呃,如果说呢,这个是一个修改操作的话呢,如果你写的这个ID呢,这个map里边没有,那其实就应该是没改成,而不是应该把它添加进去是吧。对。包括这个位置也一样哈,这个位置的话呢,我们这个ID呢,应该没有,没有的话呢,我们添加那要这个ID,万一要有的话呢,你这时候成了替换了。相当于这两个方法完全没区分开。啊,那怎么处理一下呢。对,咱们应该判断一下啊,就是说我们这个这个要添加言外之意呢,你那个表里边儿不能有这个ID的,如果要有的话呢,你就不能让它再去调了。哎,根据有没有来判断,那我就加个if,咱们那个map呢,不有个方法叫contains key吧。
21:05
哎,我写个ID,这呢就是包含。不包含的时候我们才去添加是吧。哎,所以这么着一下是不是就可以了。诶注意啊好,下边这个这个呢,是你包含的时候呢,我们才修改吗。哎,那就衣服啊,Map。第二啊,这个key把ID呢往这一扔,然后呢,这样啊,你要包含我就修改,你要不包含的话呢,我就不处理了。哎,所以这块有个小细节,大家注意一下啊。OK,这个呢是它,然后呢,看下边这个。CTRLC下边这个呢,大家在写的时候呢,是很容易出错的。来接着这个的话呢,咱们给大家说一说啊,再理清点思路,它呢要求说返回map中存放的所有的T对象,比如我们所有的value了啊。但是呢,你看咱们前面讲过,Map中的value,如果用一个集合来表示的话呢,这个集合的类型是啥?
22:01
Map中的value。是不是啊?对啊,但是呢,你看他这块要求是一个list啊。怎么着?你看啊,有同学这样写,你看对不对啊,通过map呢,咱们直接调Y64吧。这块呢,是不是就得到了这个一个叫collection这样一个类型,因为这个value是T类型,所以就带个T是吧,好,那下边呢,就return这个叫a values了。然后呢,就报错了,毕竟呢,你这是collection,这是俩类型不一致是吧?哎,然后一看报错了,1OUT加一个回车,然后再一回车,诶好了。说这事儿成了。这对吗?有认为对的不?啊,应该有啊,这个实际情况呢,不能这样写吧。这个又回到咱们讲的多肽了啊。能够强转的前提是什么呀?前提是你这个叫value,咱们如果用instance of判断一下你这个是不是这个list,这个T的话呢,它是不是应该是个true才行,是吧,说白了就是你这个value这个类型到底实打实你是不是个list。
23:06
咱们说过了不是吧。咱们原来讲这个map的时候,不是强调过这个事儿吗?它可不是一个例子啊,他要是例子早把它写成例了,他干嘛还写成collection是吧,他不是啊,那要不是的话呢,你这块强转,它不就会报这个class class except吗?哎,这个我们会去报。Class cast。啊,Exception啊,这样的一个异常。啊,这个注意这样写法可是错的啊,哎,再换一到我们前面这个同学,这个多肽这块可能有点忘了,我们再举个例子啊,比如说这个呢叫person哈,这个呢叫student。然后这是一个继承关系,如果呢,我们是new了一个student,你把它付给person了,这叫多肽,然后呢,把这个person引用了,你再强整成student,这叫向下转型,而且没报错。那如果你现在的就是一个person。又在这有个person哈,你再给他想想转型。
24:03
这个是不是就错了。对啊,这个场景是不是就类似于说的这个场景啊。只不过呢,咱们没有关心,呃,这块value它到底返回的是个什么类型,咱们只是用它的接口来接收的,大家也不用关心哈,你要非要愿意看的话呢,那你就这样看一下。点是不是叫get class?你打印一下就完了啊,你看这个类型它到底是啥,其实它不是一个list。啊,这一定要注意,所以这呢是错的啊,因为咱们现在没有数据,所以没法给大家演示,这个应该是作为一个基本的点啊,错误的。好,然后呢,下边我们看,那既然呢,它不是一个list,他又要求我们返回一个list,那怎么办。是不是就造一个,然后给它添加进去就行了。对的啊,所以呢,首先哎,这一步呢,还是必要的啊。转过来。然后下边呢,我们给他造一个a release。还是丽里边呢,就是你放的T呗。这list啊,你有一个啊a release是吧,这没问题。
25:00
嗯,把它放进去。怎么放?类有方法,是不是就爱奥啊?哎,咱们讲完了得会用哈,就不用自己再去便利了。它里边呢,自动的会去把它的元素遍历一下,给它添加进去,就跟我们自己便利呢,从执行的性能上来讲是一样的,只不过我们写的时候呢,省点事是吧。那直接我们就return一下这个list就可以了。啊,这样啊,哎,其实的话呢,还有一种方式啊。这个呢,我们叫正确的,这叫哎方式一吧。这个呢,就看大家呢,平时使用这个方法的时候呢,灵活去运用就行啊,把它呢,我们CTRLC一下,我再复制一份啊,把这个呢再注释一下。呃,这块我们得到一个这个,然后呢,其实这样啊,咱们这个release呢,有个构造器哈。CTRP一下是不是就能放一个来。啊,大家可能说,诶,这这个是什么东西,这个呢,咱们一会儿就讲这个事儿。啊好,那这个位置我写谁呢?我就把这个Y呢,我就写进去了。这个放进去呢,其实也是啊,在造这个release的过程当中啊,他就把这里边儿元素一个一个给我们取出来添加进来了,其实就类似于这个操作。
26:07
啊,这呢,我们只是使用了一下构造器啊,这个呢,就相当于一个方式二了。都可以啊。好,那这个方法呢,我们就写完了,接着来看下边这个。Can it。哎,看这个啊。这个是这样的啊,说删除指定ID对应的这个对象,那就从我们那map里边呢,做一个,诶这个咱们叫是吧,诶把这个呢给它删掉就行了,然后删掉的时候呢,它还不需要我们去返回你删掉的这个值,那就是沿I之内,我们这个蕊木呢,它有个返回值,它也不用不用那就不用了。哎,这样就得了啊,哎,或者你这里边呢,判断一下这个值是不是no,你来确定一下说诶是删除成功了还是没找到啊是吧,都可以啊。当然了,你这个删除的话呢,有可能这个ID对应的这个value呢,就是一个no。所以你提前你要说删除成功没有,或者有没有找到,你可以用这个key呢,去判断一下也行啊。
27:02
好,那么这样的话呢,咱们把这个do这个类呢,这就小了,那再回过来说呢,创建一个userr,其实这样呢,就让这个user呢,充当这个T呢。那我们就CTRLC一下。来这儿啊。哎。诶粘过来看一下啊,这个比较简单,就是扎病啊。Private int型的ID。Int型的一个age是吧。此证类型的name,诶这这比较简单啊。嗯,够大气吧。你看咱们讲这个出了面向对象之后啊,咱们讲的后边这个章节啊,其实呃,里边呢,都会用到咱们相应的面向对象的内容,呃,一方面来讲呢,就面向对象比较重要了啊,另外一方面的话呢,大家也不用把面向对象看的那么。恐怖是吧?后边的咱们都用的话呢,只要会写这个代码其实就可以啊。最后呢,咱们在为了方便呢,去打印的时候,我们整个twoth润啊,还有一个小机一点需要注意一下。
28:03
啊,因为呢,咱们马上要把这个优秀的对象是不是放到这个集合里了。只要往集合中放。除了咱们说的那个map跟没关系之外呢,其他的那些是不是有关系啊。所以呢,大家养成个意识哈,只要呢,你把这个对象呢,往机构中放的话呢,你就把这俩方法呢给。重写一下是吧。这个注意哈。所以说呢,这个方法呢,要不要重写,那就看你到底是用的什么集合了。啊,类似的不用。啊,晒晒得用。Map的话呢,你要是把它放到K的位置也得用。放到value的位置,不用。这一说就细了啊,那你就干脆就都写完就得了,不用就不用呗,写了肯定不错,但你没写可能错是吧。写完了啊,写完了之后回过来来测试啊。Do的一个测试。
29:00
哎,转过来啊。哎,在这,哎,那就没方法了啊。这个创建一个do的对象do啊,因为呢它带泛型了,所以你这块呢,创建要使用上这个泛型啊,因为呢,这块提到了咱们就是来操作user了,所以呢,自然而然的这个位置我们就指明了,就是user。诶这个呢,一定给大家加上啊填括号好完事了啊,接着的话呢,我们去调相关的这个方法呢,体现呢,你去增删改查处理我们这个user。呃,首先do,我们去做一个添加吧。这叫SE是吧,这个ID呢,比如1001啊这块,我们去一个这个具体的user。那又算LCTRLP一下这个啊,它这还有个ID呢,是吧,这个我们就写成一吧,比如说A值23。嗯,具体的。哎,这呢,是不是得起个名是吧。名,起一个名,比如说这个,哎,周杰伦吧。周杰伦吧,是吧,好这个呢,我们就添加了一个了。添加一个的话呢,这块我们跑一下其实会有问题是吧。
30:02
哎,这个还记得是啥原因造成的吧。对。啊这呢,其实写出来了,咱们在JDK17当中能看到,在JD8里边看不到了,这个我记得是JDK是12还是13还是14有个新特性啊,就是它呢会告诉我们就是你在这个假设是14的新特性,就14之前呢,就到这儿了,14以后的话呢,它会提示我们说你到底是什么是no。写清楚map是是吧。对,因为呢,我们A里边这个map呢,我们没有赋值,直接呢上来调,这不就是no。所以呢,给它赋值好回忆一下啊,给一个成立变量赋值有哪几个位置。显示。代码块。构造器对吧,哎,就这几个位置啊,你要想对于我们这个属性来讲,其实哪个位置都行,你要显示负值,那就扭一个。是不是哈希map是不是就这样写啊?哎,你要说我在这个代码块里写。那这呢,因为是一个非静态的了,所以你就写一个非静态的代码块,然后呢,是不是就。
31:02
哎,这么着一下这个位置那就不用写了。哎,你要说在构造器里写也行,构造器里边你这样附一下值是吧。都可以啊,回忆一下我们前面讲的知识点。OK,回过来啊,那这块呢,我就用这个代码块呢,做的这个复制了,然后呢,我们执行一下,此时呢看就不会报错了。OK啊,这呢,我们添加一个,再来一个。这个10022。这个。刘杰伦大一点吧,33,他媳妇比他小一些是吧?叫。昆凌。行,这个呢,就加进他两口子了啊,然后do点我们来一个list查看一下。返回的是一个list。OK啊,然后呢,这个例子呢,我们去遍历一下。便利的话呢,咱自己写写个增强for吧。哎,这个打印一下这个U,那这就可以了啊。好,走起。这不就出来了啊行,这呢是他俩,然后呢,我们还可以,比如说修改叫update是吧。
32:05
点啊,我们update。这个呢,修改的话呢,注意咱们在这里边修改,你得通过指定的ID去修改啊,你看你想改谁了。有人把昆凌想改掉,那你这块呢,是务必呢,是不是得写1002了?哎,后边呢,是不是指明你要改成谁呀。哎,就这个意思啊,CTRLC转过来,就这整个三。啊,这个来一个二十五二十六换一个周杰伦的前女友是吧。蔡依林谈过吧,应该。嗯,好,这换了啊,这个呢,他就找这ID呢,做个替换,把这个替换成这个。来,我们在下边有个例子嘛。哎,这就给换掉了是吧。嗯,OK啊,行,还可以呢,做这种删除,比如do点,我们做一个remove DA点。不叫叫delete是吧。这要删除啊,删除的话呢,你比如我想把这个1003给删掉了,是不是不存在啊。
33:04
不存在,咱们这里边儿呢,就这样云幕这块会报异常吗?不会是吧,就相当于执行的时候呢,就没找着呗,没找着呢就正常呢,就就当你没执行一样,这个意思啊好这呢我写个1002,这呢就把这个诶蔡依林这个给删掉了,这个就光成周杰伦了。那就成这样啊,行这块还有这个,嗯,Save演示呢,Get这块没演示啊,因为我们是用这个例呢,相当于是过去了一下啊,行这个我就不演示了,整个呢,这个没啥问题。啊,这个单人测试,我这写的没了单人测试一样啊。好,这是我们说的这道题,大家下来呢,可以写一写啊,我觉得这个题还可以。好,接着我们来看这个第二题啊,第二题这块呢,是来这个练习这个发音方法的啊,这个方法的这个声明呢,都给我们写出来了,那咱就直接呢拿过来用吧,CTRLC一下。哎,过来啊,这个呢是零二。好,粘过来。加个注释啊,所以呢,编写一个翻译方法,实现任意引用类型的数组指定位置元素的一个替换,把这个数组当中这个位置和这个位置的元素给换一下。
34:10
哎呀,翻新方法。啊,时代立刻没问题啊。怎么写呢?啊。其实啊,你就把这个E啊,你就看成是一个string。你该咋写就咋写是吧,交换这个string类型数组中的这两个位置的元素。这两个位置是吧,那现在就声明一个E类型的一个ta是吧。是不是就等于这个它这个数组名就叫E了啊,那这个A的位置是吧。啊,A的位置拿这个B的位置替换。B的位置啊,改成我们这个tap,这不就交换吗。就完事了。啊,就可以了啊好,写个单元测试吧。赶紧测试,我们来测试这个方法啊。嗯,那这儿呢,咱们比如说就拿论来说吧。
35:00
And a啊。BB。CC啊,就他仨吧,然后呢调这个MA1,然后把这个A2呢往这一扔,角标零和角标二,诶交换一下。交换完以后,这个数组应该就变了。那我们这块呢,再打一下这个数组得了啊A瑞点two润,把这个AR呢往这一扔。是不是咱们也讲过这个操作了,打印一下。走起。好,你看这时候我们把这个,诶角标零和角标二呢,这不就交换了。啊,没问题啊,行,这呢,就我们的第一道题,第二道题。嗯,看这个啊。说呢,编辑一个翻译方法,接收一个任意引用类型的数组,任意引用类型的数组,并反转数组中的所有元素。就是个反转。啊,这个咱们前面讲过数组的反转了是吧。这个呢,咱们就写一个for吧,得。诶,还记得吧。
36:00
诶,这个呢,我们用其中的一种方式啊,比如这个I呢,充当这个头部的这个缩引,接呢,充当于末尾的这个缩引。它点LA减个一是吧,然后呢,这个你就让这个I呢去加加接呢减减是吧,终止条件。I小于接就行。里边呢,我们去交换是吧,E的交换怎么着?是不是也得需要个临时的吧?啊,E类型的一个ta啊,然后呢,是E的一个I。E的一个I。一的一个阶是吧。接。诶这样就可以了,行,这就给交换了。哎,再过来啊,写个单元测试。行来调了一个方法,这呢,我们比如说呢,就用了。哎,注意啊,咱这的翻译方法,这个E呢,只能是一个营类型,所以呢,你不能写in的类型啊。类型的一个数组。又一个,然后呢,在这块。啊,这个我可以写这样的这个书,这呢,它会自动一个装箱的。
37:03
好,然后呢,我们去调这个方法。诶把这个AR呢给它放进去,那调完以后的话呢,它就会对我们这个数组呢,就产生影响了,我们接着去遍利一下这个数组就可以了啊to string,把这AR呢往这一扔。诶一打印就行了啊好,我们看下这个顺序呢,反没反过来。哎,这不没问题吗?OK啊行,就这块儿呢,我们主要呢是测这两个方法啊,这块呢,大家在编写的时候呢,你就把这个E啊,你要是不熟,你就想象成是string具体的这个类型,然后呢,写完之后呢,然后呢把这个string再改成这个E就妥了。啊,然后呢,你再想人家这块呢,说了它是一个不确定的类型了,你调方法的时候呢,可能是string,也可能是inter,还可能是其他类型。啊,都没问题。啊,这是这道题,然后下边这道题啊。哎,这个题的话呢,挺有意思啊,说呢说明一个学生类,包括呢姓名成绩。啊,但这个成绩的话呢。嗯,不确定什么意思啊,就是不同的老师啊,他这个标准不一样啊。
38:03
说语文老师啊,他认为这个成绩啊,应该叫优秀良好,及格和不及格相当于一个字符串。啊,这个数学老师呢,他觉得这个成绩呢,应该是一些具体的成绩这个数了。哎,所以这呢是一个double类型。啊,英语老师呢,希望是一个字符类型是吧。啊,都标准不一样啊,那这是我们设计的话呢,既然标准不一样,咱们就可以呢,诶给它指定成一个不确定的类型了。所以呢。And trust。定义成那个发型类吧。你看student的是吧。学生,把这个描述呢,咱们粘过来。你粘过来啊,哎,这个位置,比如我这块我就写成个T了。说呢有姓名有成绩啊此类型的。哎,咱们也private吧。爱思类型。叫name是吧,好,Private。
39:01
怎么着?气吧。啊,T类型的叫啊。哎,这不是这个吗。这个叫成绩,但是这个成绩的话,那个类型呢,确定不了,所以我就用一个泛型来表示了啊。嗯,然后下边这个你设计的话呢,其实你就把它想象成是一个具体类型,该咋写还咋写呗,构造器整个空的。啊,代餐的。哎,盖菜方法啊。哎,这两个都要。啊,斯顿。哎,到这儿是吧,哎,走起那这个位置写的就是高。啊,这呢,因为不涉及到往及格中放哈,所以这块ES啊还code呀,那我就不写了。行,其实呢,如果我们大家实际在开发的时候啊,像我们去,呃,目前呢,你可能看到呢,说没有考虑往契合中放,但是有可能后边会放。所以习惯性的我们在提供一个扎病的时候呢,你这个ES哈,其实也可以加上。
40:01
就是一个操作的事儿是吧,又不用自己去写。啊加上就行啊行,这呢我就没加了,好这个类呢,我们升级完以后呢,下边测试这个基本上就比较清楚了。胡东老师,这个标准不太一样啊。现在这个学校里边不知道公布公布这个具体成绩了。我记得我那时候上学的时候呢,就是期末考试完了以后呢,就都贴出来。全班的都起是吧。现在想想的话呢,后边那些同学确实不太友好哈。但是以前的话,你说这些学生吧,都贴了,大家好像也没说谁想死想活的是吧。现代化呢,一整就。就就受不了了是吧。嗯。现在这个得抑郁症的好像比例还是比较高的是吧?嗯,就是相应的,可能也是因为这个,大家这个压力也比较大啊。哎,CTRL一下。嗯,这个我们写到这儿吧。
41:07
哎,写到这儿了啊。好看一看啊,说这个语文老师呢,希望是这样的,那这块比如我们就整一个学生。哎,这个叫一,哎new一个student啊。然后呢,这个位置你看我CTRLP一下这个呢,假如我们就用带参的这个构造器了,比如这个叫Tom是吧,Tom呢,它的这个诶。咱们这忘了用泛型了哈,这个是语文老师给的成绩,这应该是string。嗯,这个位置咱们也得加上一个啊好,语文老师给这个成绩呢,你再CTRLP一下,这不就string类型了,比如说这个呢叫啊。良好是吧。哎,这就语文老师给的成绩了。哎,对于语文老师来说的啊,李老师这个数学老师。A student。这个呢,你得是一个double是吧。注意是这个包装类的啊。
42:00
Student怎么着?啊,这个呢,叫Jerry了是吧。嗯,他呢,就是得是考这个,比如87.5就成这样了啊,这语文是数学老师,然后英语老师。这个咋写?不能写叉是吧?Character啊。对,这个单词你得会写。A student are。这么着?哎,这样。啊,这个来一个肉丝是吧。是来一个A,哎,这个这样写了是吧。诶,这个你看我这样写的哈。包括这个呢,这样写的,这是不是都是自动装箱了。对的啊,行,嗯,这个我在这稍微写着吧,说存在啊这样说87.5。自动装箱。哎,自动装箱,所以这块呢,我们有这个自动装箱以后呢,其实用起来非常的方便啊,你甚至都感受不到呢。它有这样一个变化,你就拿着基本数据类型去操作就行。
43:01
哎,它也是自动装箱。好,这个完了以后呢,你对应的就打印一下这几个学生信息就行。那这个是三是吧,好,这块我们走起。那这个呢,就没问题啊。这呢就是我们体现了一下,这个还是叫泛型类这样的场景,好这块的话呢,咱们就把这个泛型这块呢,其实做的这个题目呢,也不少了。呃,重点的话呢,大家其实还是把这个在集合和比较器中的这个使用呢掌握好,其他这块呢,其实都类似啊,万变不离其宗。
我来说两句