00:00
来,那咱们接着再往下看啊,咱这个哈希map的K可以是空吗?K能不能是个空值?我们在这儿可以测试一下。来class啊,这个class的话,我们就叫做哈希map test03。就是哈希map集合K部分允许那吗?我们测一下行吧,哎,Map。嗯,String in吧in啊然后string,然后呢,Map用一个什么呢?就哈希map,或者说我不用泛型行吗?我不指定泛型了各位啊。跟泛型没关系了。来这边我引进来map调用po的方法,放一个弄进去。然后value这边呢,呃,就随便呗,Value也是那行吗?来我们输出这个map size来看一下它这个结果是几。
01:08
就是K可以为空吗?一对吧。这个是一呀,同学们是吧?哎,Map哈西map集合允许K没问题啊,允许这个K是为none的空的啊,是允许的,允许吗?允许,那如果说我在里边再去加一个nu,然后接下来加一个100进去,那你说我现在的这个map集合它的size是什么呀?会不会变成二呢?因为我说K如果重复的话,是不是覆盖啊。K重复的话,Value是覆盖吧,是不是,所以这个应该是一对吧,来我们走一下看是不是一。
02:01
就是一对吧,哎,一没问题啊,确实覆盖了,那我们可以通过key获取value吗?我们来获取一下点get啊K这边是none呗,那传一个none能不能获取到这个value啊。这个value这块呢,我们直接输出得了行吧,哎,把它呢拿过来放到这儿,然后接下来我们再去执行看一看这个VALUE6是多少,是100吧,应该是来看看啊。诶,你看100是不是,哎100啊,但是呢,你通过这个应该是能够得出来,就麦机的K是可以为空,但这个为空的值只能有一个。对吧,因为你下边要如果为空的话,就表示重复了空和空重复了这个100就给它覆盖掉了啊,就是这个允许为空嘛,允许啊,但是要注意啊哈西集合。啊,浪值只能有一个,浪值只能有一个啊,只能有一个。那了解一下啊,了解一下有同学老师这个有用没用啊,没用,以后可能会有的时候面试官可能会问你这个哈的key能不能存空。
03:08
啊,他故意就是刁难你问问你这个问题,就有可能会面的时候问一下,开发的时候用不着啊,有可能面试的时候遇到这样的问题啊,遇到这样的问题在这里说一下啊这个哈map。啊,铺的方法。对吧,哎,哈希map调一下这个put方法,Put方法put value是不是。Put value啊。呃,这个是K值。Keep。E不等于空。嗯。代码都变了啊,代码都变了,他上来按说应该有对空值的一个处理。
04:01
有没有对空值的处理啊在这。是吧,这种情况是说。呃,K等于它等于等于K,或者说K不等于空,那K等于空的情况下呢。你看变成竖了这边是吧,哎,变成树了啊。嗯。我们看一下这个八里边是什么样的,各位啊。八把这个S2C这块打开。Java。然后呢,我们有一个叫做。嗯,哈。当中有一个方法叫。
05:04
Put方法的是put value是这个代码。也是这个一样的是吧。没什么太大区别。行吧,这块就不再找了,各位啊,不再找了,按说应该是有处理的。啊,咱也不再不再细看了,各位啊,不再细看了,这个空的话其实是什么呢?就是说我直接放一个空进去是可以的啊没问题,那有同老师为什么要提这个事呢?我们来看一下这个有一个table来看啊。来。他经常放一块各位啊,来,比如说我们叫哈希table test01,我放这吧,放这个B一下各位啊,TSVM。Table the key可以为nu瞅一眼啊,瞅一眼来,比如现在呢,我有一个叫做map吧,还是map啊。
06:11
呃,这个的话导进来,然后接下来呢,我拗一个什么呀,叫做哈希table,然后这个哈希table这一块呢,嗯,咱们往里边放一个东西行吧,比如放一个none,然后这块呢,这个值呢,我们就随便给一个值呗,对吧,123是不是,哎,然后接下来呢,我们去呃执行一下。运行。好,大家看出问题了,是不是说空指针异常啊,空帧异常,那么这个high table它也是一个map集合,看见了吧?哎,这块的话我们点过去是high table的480行。这是我们这个是吧,我们点击源码看一下啊。说哪儿出现控制异常,说这。是不是这为什么出现控制异常呢?哎,大家看它Y6是不是也不能为空,如果Y6要是空的话,是不是也抛控制异常。
07:03
你看上来它有个value啊,这个方法put吗?上来它有个value,如果等于等于空的话,抛一个空制异常,然后程序到这的话,就代表value不是空,但是紧接着他会去调K的方法,他上来就调K的方法,看见没。所以这个地方是空的话,出现空制异常了,不允许哈,Table是不行的哈,Map这块呢,我刚才看了一下啊,嗯,一会儿一会儿我可以再看看啊,一会再看一下,总之这块呢,High table是不行,它的K值如果是空的话,你看这个位置空掉这个high的方法得出一个什么呀,叫做哎控制异常啊控制异常这个事儿了解一下,因为有可能会有面试官问问这个东西啊,问这个东西来high table。呃,那如果说试试啊,Map put这个K这块呢,我不是空,这个value是空,会不会出现空人异常呢?来我们再去执行一下。
08:00
好,大家看同样是不是出现了这个空值异常是吧,哎,说这是四百七十五行,四百七十五行是因为这抛抛了空嘛。是不是?所以这个high table的K和Y轴都不能为空?都不能为空啊,K可以为空吗?哈希table的key和value都是不能为nu的啊,都是不能为nu的啊哈希map k value都可以啊哈希map集合的K和value都是可以为nu的。那这一块呢,咱们还需要知道什么呢?我们来看一下high table这这边的方法都在新的吧。是不是哎都带SYNCH要注意啊,Table。方法都带有synchronized线程安全的,我说了啊,线程安全有别的方案,线程安全有其他的方案啊,这个哈希table对线程的处理导致效率较低,使用较少了,各位啊,了解一下high table啊high table然后呢,我们来看一下high table这块的一个初始化容量,其实它底层也是个含义表,也是个含义表一样的。
09:21
一样的啊各位。来,这块我再写上吧哈,Table底层也是个哈希表啊,哈希table和哈希map一样,底层都是哈希表,数据结构啊数据结构。但这个是老的这很久以前出现的一个东西,然后我们看看它这个初始化容量是多少。初始化容量怎么看?找一找构造方法,哈希table。方法点过去,好,大家看的是11吧。出装量是不是11呀。11不是二的倍数吧,它这写的对吧?啊,所以它的算法和哈map的算法可能还不太一样,初数二的11,然后呢,初始这个默认加载因子是0.75。
10:03
啊,0.75,然后了解一下,了解一下各位。了解一下哈西。Table的初始化容量是11。各位啊,是11,然后默认加载因子是。0.75,这个是一样的,0.75啊0.75,那么哈希table它这边的扩容是怎样的呢?我们也可以看一下这个high table的扩容,扩容的话,那就看看它的它的put方法吧。应该是在put方法里边找一下啊,点过去这个put方法是往里边加嘛,是不是加,然后呢,加这块是调K的哈扣的方法呗,是不是得到哈希值。你看这个其实就是哈伊算法,看见没。就哈西,然后与什么呀?0X7F这么一个数是不是啊,与二这个二进制运算啊,与完之后的结果干什么呀?用百分号对它进行求余数,就是我刚才所说的七啊,对三求余数啊,或者是四啊,对三求余数都有可能等于一,而这个index就是数组的下标嘛。
11:06
就是数组的加标啊,数组加标拿到这个安垂,而这个安垂其实就是那个节点。啊,然后at entry你看是吧,这没有扩容的事儿是吧,点一下看那个添加这个ENT,看里边有没有at entry里边找找找找这块的话往下走,如果count大于这个门限值,这个门限值这应该是超了吧,等于是对吧,超的情况是属于SH。的意思应该就是说扩容吧,我们看看这个啊方法看一下一,那么这个方法里边说了,说new,呃,Capacity新的容量等于老容量左移左移二进制左移移位加一,这应该是二倍再加一对吧。哎,所以他这个他这个扩容方式跟我们之前那个还不太一样啊,是老容量二倍再加一啊,二倍再加一,了解一下这是原代码看的啊,就table的扩容是什么呢?是扩容之后的容量。
12:01
啊,扩容是怎么扩容的,是原容量乘以二再加一。原容量乘二再加一啊这种这个效果。就你要是在这个叫做页面图上去展示出来的话,我们可以在这儿去写一写。写一下。这写一下哈,Table集合底层哈表数据结构是线程安全的,其中所有的方法都带这个关键字,效率比较低,现在使用较少了,对吧?啊,因为控制线程安全有其他更好的方案,那这边接着往下写就行了啊,就high table吧哈,Table的key和value不允许none。是不是在这补一句话,哎,哈希什么呀?Map集合的key和value允许none是不是?哎允许呢?那这是第一个,另外再往下就是哈希table啊集合初始化容量11啊,然后希table集合啊,扩容是原容量乘以二再加一。
13:07
二再加一。Table啊哈table,嗯哈,Table集合扩容之后是原容量乘二再加一啊乘二加一,这是一个哈,Table这块的一个一个东西,各位啊了解一下,因为这个以后咱们不用啊。用不着用不着啊。但是我们对这个properties这个类呢,有可能会需要使用啊,我现在呢,给大家讲一讲这个properties里边常用的一些方法好吧。
我来说两句