00:00
哈喽,各位小伙伴们大家好,那么今天由我来给大家分享几道关于Java相关的面试题,那本套面试题呢,有四大特点,第一是高频面试。我们在企业面试的时候呢,有很多面试题,那么在这个地方呢,老师不可能一一给大家讲。那么我们重点抽取高频面试的题给大家分享一下第二个。本套明日铁力求精度和深度。第三,更为贴近企业实际需求。企业在面试以及后续开发的时候用的比较多的技术。那么第4个本套MRT特点保持不断的迭代升级。好,那我们首先来看一下第一道题。第一道题呢?考察的基础点是哈西漫画,它的数据结构是什么?
01:00
这道问题呢?是一道考察哈西迈克基本功的问题。难度指数。1星。那么也是。对于加了学习完毕之后问大家比较多的一道题。基本上啊,大家都能回答出来,那么在这个地方呢?好,首先你在回答的时候,你要说一下1.7的时候呢,它是数组加上列表。然后1.8之后。奥尔朵公司,他对哈希办法做了一个重写。链表速度。速度列表加上红黑数的方式。OK, 能够把1.7.8这两个版本的不同说出来,以及相关的数据结构说出来,这道题基本上就快回答完毕了。
02:04
那么第二个面试官会接着继续追问。追问是什么呢?他说两个对象的哈希扣的相同的时候会发生什么?注意这个场景的话呢,我预设的场景是在哈希曼谷上。好吧,是在哈西曼克上那么两个对象的哈希扣的相同的时候。有可能。会。一致。也有可能不想啊。不一致,因为我们要注意这两个对象,它的哈西扣的一致,还有一个。需要判断的地方。就是它的。内容是否?一致。OK.那么在这个地方,如果说两个对象的哈希code一样的,在哈希map里面就是一个哈希冲突。
03:07
好吧。那我们呢?当在哈希map上啊,两个对象的哈希扣的一致的时候,注意那我在这个地方。我们来说一下。如果说他的哈希。注意啊,前提是在哈西。Map啊,这种数据结构。之上它存储的元素,然后呢,哈西扣的。一样。然后呢,如果说什么呢。它的内容也一致。好。数据内容一致,则。不能添加到。是吧,同一个哈希曼。
04:00
对一下。好,那否则呢。否则的话呢,就是内容啊不一致。不一致的话呢,这时候是一个哈希冲突,怎么样啊,在此练表在。子。结构之上。好变成什么呀?链表格式。好,那么面试官呢,问的主要是这一块啊,看你的对于哈希扣的以及内容是否一致,是否一样,那么这个呢,也是属于基本功。好,难度指数。算一星。第三个来我们看一下。问,哈希map,它的初始容量是多少?那么初始容量是多少呢?哈西办法的初始容量是16,在什么地方呢?注意在这个地方大家呢。
05:06
要。来看一下我们的。源码。那么在源码的时候呢,往下拉啊,是哈希外的源码往下拉。看到没有,在237行代码,它有一个default I.In头capsc,那么这个的话呢,是一向右移动四位,那么这个地方就是什么16好,我们把它拿过来。好,那么本题也算基本功。好,难度指数。1星。
06:00
啊,往下。增加难度了。第4道题。第4道题呢,问的是链表什么时候变成红黑数?那么链表在什么情况下会变成红黑数呢?是这样的,它这涉及到一个什么呀,链表的链表啊。啊,这个地方呢,是前提条件好吧。还是在哈西漫画里面。啊,因为我这个地方呢,都是哈西卖房啊。他考察的也是一个基本功难度指数。好,2型。OK, 那我在这个地方呢,已经。创建了一个。好这样一个表格,那么这个表格呢,大家看啊,它是一个。
07:03
关于哈希迈克存储的。最开始的时候我是一个什么呀,数组是吧。阿西麦。那么初始容量。多少呢?16。好,那么下标0~15的数组。那我们刚才说了啊。如果说。数据。对吧,没有的情况下,比如说在这个地方,那我存的是一个。我存一个数是1啊,假如说存一个数是1。那么存这个数值是1呢?长度是16,我们现在呢,采用这样一种方式,比如说对长度取余法。对,长度取。到这儿。
08:01
那么一对16取多少?是不是等于1,那么这时候的话呢,我把当前的1我放在这个地方。是吧?OK, 那如果说后续我又来了一个数。那来了这个数呢,是3。是放到3那个地方。对吧。接下来,假设我现在又来了一个数。再一个数的话呢,是。17。那么17他这个时候。对,16区域是几?是不是也是1。对吧,那么在这种情况下,大家看一看是不是产生一个冲突了。对吧,你按照对16取余的方式。好,我放在当前哈希map上,哎,都放在这个地方。
09:02
这个时候的话呢,怎么办来判断。内容是否一致。好,我们发现。内容不一致。则。将。17。好。则将17怎么样呢?添加。链表。添加到这个链表。在这个时候注意看啊这个。在哪儿呢,链表?他在。1的后面。那么也就是说,1。这是第一个元素是吧,好第一个元素,然后呢,下面这个列表的话是17。
10:00
那如果说后续再往下有相关类似冲突的。对吧,啊,比如说。33。对吧,那角2323。那么33的话呢,是不是也在这个地方是吧。那么往下来看啊。是我们先到链表了是吧,啊先到链表。那么到链表的时候呢,他说呀。链表在什么时候变成红分数?好,那首先。哈希曼了。它数组的存储结构。在哈西冲突的时候。然后呢,长度够用。
11:02
情况下变成列表格式。好,刚才我们看到了列表,如果长度非常长的话呢,它需要有一个转换。那么这个转换呢,注意是它的长度。大于等于8。那么还有一个。是最小容量。是64。情况。它会变成。可以输。好,什么意思呢?我们从官方源码来查看一下。好,大家看一下。那么使用数而不是链表的这种计算阈值。当向其中有这么多的桶中添加元素的时候,桶呢,就是我们这个一法的链表。
12:00
统将转换成数,该值必须大于2,并且。至少为8,就是大于等于8。大家看到没有,这个值是8。好,往下来看。还有一个。这个条件,那么这个条件呢,有的时候有同学在面试的时候啊,也有可能会忽略。在这上写的是对桶进行数化的最小的表容量。如果说一个病当中的节点太多。就是节点比较多的时候,则会调整表的大小。那么应该最少是多少呢?是4乘以。4乘以。它的一个倍数,以避免调整大小和竖画阀值的冲突,在这儿呢,我们设置的这个最小值是64,好吧,这个地方设置是64。这个呢是第4道题,那相对来说呢,就有一定的难度了,需要大家去看一下。
13:06
那么第5道呢,给我们说的是如何来扩容。好,那么他也是面试的基本功。啊,男子指数呢,我说是啊。2个姓。扩容的话呢,是这样的。大家需要在这个地方来了解一个点。这个点呢。要老是一个概念,它叫做负载1。那我们知道。在哈西漫画里面。老师呢,放到上面。好到这儿啊。还在往上啊。好放到这儿啊好了。那我们呢,在这个地方大家看啊,假设。你这个地方呢,0。15、那我们在卡西map里面存储的数据是不是有限的呀?
14:05
对吧。那我们知道啊,集合它是一个。变成的数据容器。我们是不是到。超越它之后才进行一个扩容呢。是的。好,这个地方呢,需要了解一个。概念叫做负载因子,那负载因子呢,也叫做加载因子。好,它来自于。数学的一个。概念点叫做泊松分布。啊,这是在数学上经过验证的。当比较小的时候。对吧,你说这时候我们进行扩容太浪费太浪费是吧,频率太高。那么当比较大的时候呢,我们进行扩容有点晚了。这个呢,数学上啊,是经过验证的,我们往上来看。
15:03
好,大家看到没有。这都都是源码啊,这个地方有一个0.75,我们再次来看一下源码。那么原法告诉我们看到没有,在构造函数当中,它没有指定使用的负载因子,默认的就是0.75。好。及往上。往上这块的话呢,是。刚才我们说那个竖画啊,大家看到没有竖画。竖画的话呢。告诉我们。在8的时候。他这种碰撞几率。是千万分之一。再到9的时候呢,是1万分之一了,所以说啊。好,那么往下来看啊。那么负载因子呢?它是多少呢?是0.75。好,什么时候扩容呢?是这样的。
16:01
我们在。这个哈希map,我们在一直put的时候,往里面put的元素是吧,Put的元素呢,往下来看原码。好,那下面呢。找啊。它里面有这样一段话叫做。看到没有?Resign的时候。那么这个时候这是一个扩容。该元素啊进行扩容的时候。来看到没有这个地方。是有一个新的这个长度乘以什么呀,这个负载因子。对吧。对负债因子呢,做了一个相同的炒作。那么另外呢,还有一个情况下,就是原来的看到没有default你们看啊说新的这个长度多少呢。
17:02
等于默认的初始值。对吧,然后呢,我们有一个默认的。加载因子乘以初始的容量。好注意啊,在这个地方我们扩容的时候是这样的。扩容的情况下是。我们的容量乘以负带因子。来往里面。传递值最开始的初始容量我们知道是16。然后呢,乘以这个值是多少呢?0.75。那么16乘这个0.75。多少?12。也就是说。当。我们的。树种的长度。是吧?存储元素。
18:01
个数。咱超过12的时候。有开始怎么样?扩容。好吧,我们就开始进行扩容。那么它在扩容的时候需要注意。是这样的啊,你可以看一下源码也可以呢,直接听老师说就可以了。他在扩容的时候是。翻倍的一种方式。直接翻倍,那么直接翻倍原来是16,那么现在呢?乘2多少?就是32。那么也就是说,我们扩容之后,它的长度变成了原来容量的。2倍。那下一次或者再次往这儿来套,下一次的话呢,看到没有,刚才有一个new capacity是吧,New capacity啊,乘以这个负债因子。好,那么下一次的时候呢,就是。
19:03
32再乘以0.75就是24。好,这是又是一个。动态扩容。OK.来,我们来看一下。这一块啊。那么这块的话呢,大家来看一看。我们来运行一下这个程序,大家先来看一下效果。这是利用反射机制,我已经给大家写好了一个。对于哈希卖法,同学们测试好,往下往上来看。容量是十六十六对吧,到这个地方啊,这是没有数据元素的时候,所以说显的是阈值和元素。个数的都是0。往下来看。当这个地方原数个数是1的时候,容量是1是吧,这时候大家看到没有,它的阈值呢,都是12。
20:04
那这个阈值呢,就是负载因子。好,我们这个地方看到没有负载因子乘以那个容量,这就是他的这个阈值。往下来看。好,大家看。看到没有?我的原素数量是12的时候。怎么样?它的阈值是不是还是12,当我这个地方,我原数的数量我是13个。你的最开始容量是不是16个呀,我已经超出了你这个阈值。超出了抑郁症。这个阈值是多少?12,那怎么样开始扩容3倍?对吧,做了一个翻倍操作,然后呢,翻倍操作预值仍然是新的。容量乘以负载因子。所以说这个地方是24。好,那么大家呢去想。
21:00
详见啊,老师这个代码是吧。OK, 那么接下来。下面呢,还有一道。稍微难的题。他说如何来一次性设置1024个元素不扩容?好,那这个呢,来路指数。他最少是3星和4星之间吧。什么意思呢?他考察的知识点。是哈西曼法的。基本功。就是你了解不了解哈希迈尔?他的。基本构造这一块。那么我们知道。对于哈希麦克来说。往上来看。我们这个哈希曼法,我们可以给他指定无参的,看到没有。口罩。对吧。
22:00
这个呢,是很多初学者在学习哈西曼舞的时候。构造会多一点。因为在这个地方无参构造的话呢,它有这样几行代码,大家来看一下。那么this the load factor就是你当前的来因子,等于默认的这个。自带因子0.75。默认的初始容量就是16。好了,那么我们在468行代码,我们也可以给他设定一个。In capacity给它设定一个。初始容量。我不想让它扩嘛,对吧,以及往上你还可以自己来设定一个自定义的附带名字。那么0.75这个负载因子是数学家人家经过测算的。效率最高的,所以说我们就不要动了。怎么办呢?是这样的。大家在这儿写的时候。还回到question这样一个地方。
23:00
怎么样一次性你在这个地方设置1024个元素括。那肯定我们来写一个。110。2。二四行不行,1024的时候来看一下。运行。我们来看一看,假设它的初始容量是1.24。注意看它的初始容量是1024,阈值呢就是7682。好元素数量呢,注意看啊这个地方。好,往下来看,这时候你放了1024个元素,它会不会扩容,肯定会扩容是吧。所往下来看啊。这里面呢,其实省略了很多。那我们的下一个多少啊。假如说是1033。我的容量设定的是1033。
24:03
好,大家看一下。当我来超越啊,1024。1033的时候。我们就看这个阈值吧,这个阈值的话呢,已经到多少了。1536。1536是不是已经超越了1024。对不对,那么也就是说。你在这个地方需要怎么样啊,设置一个操作。这个阈值范围的。是吧?初始容量。好,那么也就是说这个初始容量。初始容量已乘以0.75大于。OK, 这是大家需要注意的啊。嗯。
25:00
好,那么另外呢。还有一个小点,这个小点的话呢,有同学已经刚才呢看到了。就是。哈希曼法,他在扩容的时候呢,是16。32。然后呢,64。都是2的N次幂。成倍的进行扩容。OK, 这个是需要大家注意的,刚才我们是1024,然后呢2048。好,今天的明日题,我们就先讲到这个地方。啊,再见。
我来说两句