00:00
大家好,我是海波老师,咱们继续来讲加va的集合,我们这里呢,来拷贝一个新的代码,把这个二呢,我们改成三,我们点击OK,然后呢,把里面的东西啊,咱们全去掉,咱们不要了,好,然后呢,我写上一个叫哈希map,不过呢,我要增加泛型了,我这里写上一个string,我再增加一个integer,咱们包装类型啊,咱们就叫map,等于new,咱们叫哈希map,然后呢,写上一个string,我们再叫做integer就可以了啊好,写完之后现在往里面放数据,我们叫做map,点我们的put,写成一个A,写成一个一,好,接下来我们写上它,我们叫做B。我们写上一个C,我们写上一个二,写上一个三可以了,我们的ABC啊,我们现在都已经准备好了,我们的V就是123对不对?行,现在我想把这个数据呢,我挨个遍历一下,所以呢,我们写上map,点我们的key site,然后呢点一下VR回车,回车以后啊,这个呢就是我们的key,咱们加个S,所有的key它都在这个集合当中,所以我可以给它遍历一下,我们这里采用的就是增强for循环的便利,所以来放过来,放过来以后每一个key我就能拿到,拿到以后呢,我就准备去遍利一下,我们打印,打印之后非常的简单,我们直接map.get我们的key就行了,就这么简单呀,同学们,好了,我写完以后我点击右键我执行一下啊好了,那么我执行完了以后,我写看到我有123对不对,但是呀,我想在中间干嘛呢,把这个B呢删掉,我继续往下打印出C来,所以呢,我这样我叫if。
01:31
如果我当前的这个我们的key啊,我们写上它,诶放过来,放过来以后干嘛呀,我们的map点我们的remove,把咱们的这个key啊给它删掉,因为如果你的key等于B,不就等于把B删掉吗?就这么简单,所以呢,我们现在运行一下,咱们看结果啊,好了,接下来我们就来运行一下,运行之后啊,你就会发现它不光是取不出来那个B了,他还直接就报错了,哎,老师这个嗯没有多难吧。
02:01
怎么还会发生错误呢?这个的原因在哪里呢?这里就给大家解释一下了,这个的原因就在于啊,我们对集合进行处理的过程中间啊,咱们对集合的数据进行了修改所导致的,咱们这里的集合呀,咱们往里面增加了三条数据,我们就认为呢,对这个集合我操作了三次,对不对?那么你增加了三条数据以后,你拿到的这个集合其实就是这三条数据的ABC。但是呢,在你循环过程当中,你把它对应的这个B删掉了,同学们你要注意了,我们的这个side可没有变啊,你把它删掉了,就意味着它里面只剩两个了,但是这个set呢,还认为它有三个,这样的话数据不就不一致了,对不对?所以啊,咱们知道删掉了,但是我们这个set他并不知道怎么办,他还会继续执行,所以它就会出现错误,那怎么办呢?难道就不能在便利的过程中对数据进行操作了吗?其实大家想一想,修改数据是没有问题的,但是你增加数据和删除数据是不是就都会有问题啊,为什么呢?因为数量发生了改变嘛,对不对?大家看看啊,我不光是我们删除我们的这个B呀,如果我删除别的,比方说我删除C。
03:11
只要你删除了,其实都会出现问题,运行运行以后看结果,你会发现它照样会出问题,但是如果你是C的情况下,你是C,然后干嘛呢?我们再去删除,比方说B,好,我们运行运行之后大家看结果,你这个时候看看好像没问题吧,哎,老师这是为什么?很简单,因为当你循环最后一个的话,你怎么变跟我都没有关系了吧,对不对,但是恰恰呢,你在中间的时候,你变了我们的数据啊,就可能会出现冲突了,哎,那如果能有一个办法,在我们map数据发生变化的时候,能够通知这个set对象是不是就行了呢?你告诉他一声,你说我这变了,那这样的话是不是就好了呢?其实啊,咱们map提供的这种方式,只不过它不是这个set了,它是一种特殊类型的对象,我们称之为叫迭代器。
04:02
啊,有一个专门的迭代器来干这个事情,也就意味着它就可以获取通知来得到我们修改之后的那个数据,那好,我们来用一下,老师啊,怎么去用呢?这个呢,记住了,同学们,我们这个就不要了,把它注掉,注掉了以后我还是拿到我的set,但是呢,我们来拷贝一下,它会有一个方法,这个方法的名字叫itator,这个eator呢,就是我们的迭代器,然后呢,你在这里呢,我们点一下VAR回车,回车以后在我当前的这个位置就得到了一个迭代期对象,老师,这个迭代期对象干什么用的呀,很简单,它就是用来专门迭代我们数据的,而且我的数据一旦发生变化,它也会收到通知,所以呢,我们就写上它,咱们叫做well,为什么用well呢?因为这个迭代器当中啊,它有一个方法,这个方法呢,就写上一个点叫has next。他就判断一下我当前的这个集合数据啊,有没有下一条数据,这个就叫has next,所以啊,咱们说一下咱们的这个has next方法,这个我们的方法呢,它用于判断我们是否存在我们的下一条数据,咱们叫下一条数据,诶下一跳是吧,嗯,咱们叫下一条。
05:15
数据啊,然后呢,我这里呢,你有下一条你把它取出来啊,所以我写上它叫获取下一条数据,你都有下条就把获取到呗,所以我们的E诶拿过来,拿过来以后点一下,我们这里写上叫next,诶你把它取到了,取到了以后你拿到的就是你要的那个数据,所以给他一个气就行了,那好这个时候呢,我们来操作一下,操作以后呢,把这个我们放过来。好了,我现在运行一下,同学们,我们运行一下看结果,你会发现我们这里123没有任何的问题,对不对?好,跟刚才一样,如果你当前的key我们写上if,我们这里写上,如果我们的b.equals啊,我们写上它,我们叫做key,那这个时候呢,怎么办?我想把它删掉,记住这个删不要用MAP3,你要用迭代器来删,你迭代器告诉他我们要把它删掉,这样的话我们就会同时更新,你这么写就行了,行了,以后大家看一下我现在运行,记住我现在运行之后,你会发现我们的一那个二就没了,是吧,就是个三就可以了。所以同学们,这就是我们特殊的数据的便利方式,用的是一种迭代器的方式,哎,老师啊,那如果你当前的key等于B的话,你能不能把其他的key给它删掉呢?这个是不允许的,为什么?因为我们的迭代器啊,它的这个删除呢,只能对自身当前循环的值删除,你不允许对别的字删除,为什么呢?因为如果你删除的话,还会出现同样的问题。所以咱们这个。
06:43
可以说一下咱们的蕊木方法,它只能对当前数据啊,当前数据删除,你不能对其他数据删除,这是做不到的,这个呢,我们需要给大家去介绍一下啊,老师啊,为什么要这么设计呢?哎,其实主要就是担心啊,你在便利数据的时候啊,有其他的人对你的数据进行恶意的修改,导致数据不一致,出现风险,所以咱们哈希map呀,就会提示咱们的错误,这其实是为了保护你的数据,它不是问题,而是一种策略,懂吗?同学们。
我来说两句