阿里HashMap面试夺命连环21问
1、HashMap的数据结构?
A:哈希表结构(链表散列:数组链表)实现,结合数组和链表的优点。当链表长度超过8时,链表转换为红黑树。transientNodeK,V〔〕table;pre复制代码2、HashMap的工作原理?
HashMap底层是hash数组和单向链表实现,数组中的每个元素都是链表,由Node内部类(实现Map。Entry接口)实现,HashMap通过putget方法存储和获取。
存储对象时,将KV键值传给put()方法:
、调用hash(K)方法计算K的hash值,然后结合数组长度,计算得数组下标;
、调整数组大小(当容器中的元素个数大于capacityloadfactor时,容器会进行扩容resize为2n);
、i。如果K的hash值在HashMap中不存在,则执行插入,若存在,则发生碰撞;
ii。如果K的hash值在HashMap中存在,且它们两者equals返回true,则更新键值对;
iii。如果K的hash值在HashMap中存在,且它们两者equals返回false,则插入链表的尾部(尾插法)或者红黑树中(树的添加方式)。
(JDK1。7之前使用头插法、JDK1。8使用尾插法)(注意:当碰撞导致链表大于TREEIFYTHRESHOLD8时,就把链表转换成红黑树)
获取对象时,将K传给get()方法:、调用hash(K)方法(计算K的hash值)从而获取该键值所在链表的数组下标;、顺序遍历链表,equals()方法查找相同Node链表中K值对应的V值。
hashCode是定位的,存储位置;equals是定性的,比较两者是否相等。3、当两个对象的hashCode相同会发生什么?
因为hashCode相同,不一定就是相等的(equals方法比较),所以两个对象所在数组的下标相同,碰撞就此发生。又因为HashMap使用链表存储对象,这个Node会存储到链表中。4、你知道hash的实现吗?为什么要这样实现?
JDK1。8中,是通过hashCode()的高16位异或低16位实现的:(hk。hashCode())(h16),主要是从速度,功效和质量来考虑的,减少系统的开销,也不会造成因为高位没有参与下标的计算,从而引起的碰撞。5、为什么要用异或运算符?
保证了对象的hashCode的32位值只要有一位发生改变,整个hash()返回值就会改变。尽可能的减少碰撞。6、HashMap的table的容量如何确定?loadFactor是什么?该容量如何变化?这种变化会带来什么问题?
、table数组大小是由capacity这个参数确定的,默认是16,也可以构造时传入,最大限制是130;
、loadFactor是装载因子,主要目的是用来确认table数组是否需要动态扩展,默认值是0。75,比如table数组大小为16,装载因子为0。75时,threshold就是12,当table的实际大小超过12时,table就需要动态扩容;
、扩容时,调用resize()方法,将table长度变为原来的两倍(注意是table长度,而不是threshold)
、如果数据很大的情况下,扩展时将会带来性能的损失,在性能要求很高的地方,这种损失很可能很致命。7、HashMap中put方法的过程?
答:调用哈希函数获取Key对应的hash值,再计算其数组下标;
如果没有出现哈希冲突,则直接放入数组;如果出现哈希冲突,则以链表的方式放在链表后面;
如果链表长度超过阀值(TREEIFYTHRESHOLD8),就把链表转成红黑树,链表长度低于6,就把红黑树转回链表
如果结点的key已经存在,则替换其value即可;
如果集合中的键值对大于12,调用resize方法进行数组扩容。8、数组扩容的过程?
创建一个新的数组,其容量为旧数组的两倍,并重新计算旧数组中结点的存储位置。结点在新数组中的位置只有两种,原下标位置或原下标旧数组的大小。9、拉链法导致的链表过深问题为什么不用二叉查找树代替,而选择红黑树?为什么不一直使用红黑树?
之所以选择红黑树是为了解决二叉查找树的缺陷,二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了,造成很深的问题),遍历查找会非常慢。推荐:面试问红黑树,我脸都绿了。
而红黑树在插入新数据后可能需要通过左旋,右旋、变色这些操作来保持平衡,引入红黑树就是为了查找数据快,解决链表查询深度的问题,我们知道红黑树属于平衡二叉树,但是为了保持平衡是需要付出代价的,但是该代价所损耗的资源要比遍历线性链表要少,所以当长度大于8的时候,会使用红黑树,如果链表长度很短的话,根本不需要引入红黑树,引入反而会慢。10、说说你对红黑树的见解?每个节点非红即黑根节点总是黑色的如果节点是红色的,则它的子节点必须是黑色的(反之不一定)每个叶子节点都是黑色的空节点(NIL节点)从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)11、jdk8中对HashMap做了哪些改变?
在java1。8中,如果链表的长度超过了8,那么链表将转换为红黑树。(桶的数量必须大于64,小于64的时候只会扩容)
发生hash碰撞时,java1。7会在链表的头部插入,而java1。8会在链表的尾部插入
在java1。8中,Entry被Node替代(换了一个马甲。12、HashMap,LinkedHashMap,TreeMap有什么区别?
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历时,先取到的记录肯定是先插入的;遍历比HashMap慢;
TreeMap实现SortMap接口,能够把它保存的记录根据键排序(默认按键值升序排序,也可以指定排序的比较器)13、HashMapTreeMapLinkedHashMap使用场景?
一般情况下,使用最多的是HashMap。
HashMap:在Map中插入、删除和定位元素时;
TreeMap:在需要按自然顺序或自定义顺序遍历键的情况下;
LinkedHashMap:在需要输出的顺序和输入的顺序相同的情况下。14、HashMap和HashTable有什么区别?
、HashMap是线程不安全的,HashTable是线程安全的;
、由于线程安全,所以HashTable的效率比不上HashMap;
、HashMap最多只允许一条记录的键为null,允许多条记录的值为null,而HashTable不允许;
、HashMap默认初始化数组的大小为16,HashTable为11,前者扩容时,扩大两倍,后者扩大两倍1;
、HashMap需要重新计算hash值,而HashTable直接使用对象的hashCode15、Java中的另一个线程安全的与HashMap极其类似的类是什么?同样是线程安全,它与HashTable在线程同步上有什么不同?
ConcurrentHashMap类(是Java并发包java。util。concurrent中提供的一个线程安全且高效的HashMap实现)。
HashTable是使用synchronize关键字加锁的原理(就是对对象加锁);
而针对ConcurrentHashMap,在JDK1。7中采用分段锁的方式;JDK1。8中直接采用了CAS(无锁算法)synchronized。16、HashMapConcurrentHashMap的区别?
除了加锁,原理上无太大区别。另外,HashMap的键值对允许有null,但是ConCurrentHashMap都不允许。17、为什么ConcurrentHashMap比HashTable效率要高?
HashTable使用一把锁(锁住整个链表结构)处理并发问题,多个线程竞争一把锁,容易阻塞;
ConcurrentHashMapJDK1。7中使用分段锁(ReentrantLockSegmentHashEntry),相当于把一个HashMap分成多个段,每段分配一把锁,这样支持多线程访问。锁粒度:基于Segment,包含多个HashEntry。JDK1。8中使用CASsynchronizedNode红黑树。锁粒度:Node(首结点)(实现Map。Entry)。锁粒度降低了。18、针对ConcurrentHashMap锁机制具体分析(JDK1。7VSJDK1。8)
JDK1。7中,采用分段锁的机制,实现并发的更新操作,底层采用数组链表的存储结构,包括两个核心静态内部类Segment和HashEntry。
、Segment继承ReentrantLock(重入锁)用来充当锁的角色,每个Segment对象守护每个散列映射表的若干个桶;
、HashEntry用来封装映射表的键值对;
、每个桶是由若干个HashEntry对象链接起来的链表
JDK1。8中,采用NodeCASSynchronized来保证并发安全。取消类Segment,直接用table数组存储键值对;当HashEntry对象组成的链表长度超过TREEIFYTHRESHOLD时,链表转换为红黑树,提升性能。底层变更为数组链表红黑树。19、ConcurrentHashMap在JDK1。8中,为什么要使用内置锁synchronized来代替重入锁ReentrantLock?
、粒度降低了;
、JVM开发团队没有放弃synchronized,而且基于JVM的synchronized优化空间更大,更加自然。
、在大量的数据操作下,对于JVM的内存压力,基于API的ReentrantLock会开销更多的内存。20、ConcurrentHashMap简单介绍?
、重要的常量:
privatetransientvolatileintsizeCtl;
当为负数时,1表示正在初始化,N表示N1个线程正在进行扩容;
当为0时,表示table还没有初始化;
当为其他正数时,表示初始化或者下一次进行扩容的大小。
、数据结构:
Node是存储结构的基本单元,继承HashMap中的Entry,用于存储数据;
TreeNode继承Node,但是数据结构换成了二叉树结构,是红黑树的存储结构,用于红黑树中存储数据;
TreeBin是封装TreeNode的容器,提供转换红黑树的一些条件和锁的控制。
、存储对象时(put()方法):
如果没有初始化,就调用initTable()方法来进行初始化;
如果没有hash冲突就直接CAS无锁插入;
如果需要扩容,就先进行扩容;
如果存在hash冲突,就加锁来保证线程安全,两种情况:一种是链表形式就直接遍历到尾端插入,一种是红黑树就按照红黑树结构插入;
如果该链表的数量大于阀值8,就要先转换成红黑树的结构,break再一次进入循环
如果添加成功就调用addCount()方法统计size,并且检查是否需要扩容。
、扩容方法transfer():默认容量为16,扩容时,容量变为原来的两倍。
helpTransfer():调用多个工作线程一起帮助进行扩容,这样的效率就会更高。
、获取对象时(get()方法):
计算hash值,定位到该table索引位置,如果是首结点符合就返回;
如果遇到扩容时,会调用标记正在扩容结点ForwardingNode。find()方法,查找该结点,匹配就返回;
以上都不符合的话,就往下遍历结点,匹配就返回,否则最后就返回null。21、ConcurrentHashMap的并发度是什么?
程序运行时能够同时更新ConccurentHashMap且不产生锁竞争的最大线程数。默认为16,且可以在构造函数中设置。
当用户设置并发度时,ConcurrentHashMap会使用大于等于该值的最小2幂指数作为实际并发度(假如用户设置并发度为17,实际并发度则为32)
原文:cnblogs。comYoung111p11519952。html
邓超新戏首映子女到场支持,11岁儿子帅气抢镜,孙俪穿短裤秀美1月12日,据媒体报道,邓超孙俪主演的电影《中国乒乓之绝地反击》举行首映礼,一对子女特意到场支持,很是温馨。曝光的现场照中,一家四口罕见同框,全员颜值都很高,画面养眼。……
遇见白鹇【诗意中国】作者:洪忠佩从鹤溪去往豸山岭,要绕过小桥流水人家的李坑村。路边乌桕枫香的叶子飘红,攀缘挂果的金樱子黄中泛红,只有吐穗的芭茅,以及裸露田间的稻茬呈现出灰黄……
科学家大气氧含量或重回24亿年前,地球可能发生颠覆性转变综述如今的地球已经是千疮百孔,人类的快速发展和资源消耗正在影响着地球的变化。环境变化对人类生活的影响已经越来越明显了。我们能够感受到气候的改变给生活带来了许多不便和麻烦。……
足协的神仙操作(三)16:国家队选帅要笔试。2009年,南勇上任后,在选帅的问题上别出心裁,对应聘者进行长达180分钟的笔试,网上有消息爆出,笔试内容十分奇葩。笔试出来的主帅,是让他去纸上谈……
哈勃望远镜观察到流浪黑洞离开星系的迹象新华社北京3月18日电美国研究人员通过哈勃太空望远镜发现了一颗流浪中的超大质量黑洞,它可能是从所属星系中弹射出来的,正拖曳着一条由炽热气体和新生恒星组成的尾巴在太空中前行。……
知名港星患大肠癌三期!切除15厘米肿瘤,做完四次化疗暴瘦近2本文编辑剧透社:issac未经授权严禁转载,发现抄袭者将进行全网投诉现年67岁的知名港星、资深主播苏施黄,在去年年底的时候,突然透过社交媒体上宣布自己患上了大肠癌,……
腾讯投了一辆自行车,售价12000起你可能会感到意外:腾讯刚刚投了一家自行车公司。投资界获悉,深圳市十方运动科技有限公司(简称十方运动科技)最新发生工商变更,其中新增股东广西腾讯创业投资有限公司、珠海玥和企……
崇明这座庄园民宿里竟然还藏着个小公园穿梭幽静茂密的杉林,走过临近河流的小径,你永远不知道下一秒会收获什么样的风景。是花境迷人,是竹林幽幽?是湖心小岛,是曲折廊桥?是碧波荡漾,是……
图集十五周年!深圳一园区给员工送礼包12月7日,深圳F518创意园(以下简称F518)进行一场充满欢乐趣味的F518er创造游园会大型快闪活动,在短短的3个小时里,送出数百份礼品,给入园企业与员工带来欢笑,培养凝……
后悔!杭州女子烫发后,及腰长发全碎了简直是毁容杭州的刘女士上个月在一家美发店烫发她说烫完之后非常后悔选择这家店因为这次烫发对她而言简直如同毁容刘女士一直留的是长发,记者见到她的时候,她的头发差……
姚彦许昕的爱情一个持家有道,一个事业有成,幸福的背后是成全2016年,随着国乒男团在团体总决赛中以3:1战胜日本队,夺得了冠军,实现奥运男团三连冠,奥运赛事也正式宣布告一段落。许昕面无表情,左手紧紧攥着来之不易的奥运……
近17亿!多家万亿公募掀自购潮,普通基民能买了吗?A股收复3000点开启反攻之际,一场基金自购潮来袭。继17日多家万亿公募出手自购,18日多家金融机构选择跟上。10月18日早间,鹏华基金发布公告称,基于对中国资本市场长期……
襄阳高铁朋友圈不断扩容高铁以速度快、舒适性强等优势,给人们带来了方便快捷的出行体验。近年来,襄阳的高铁朋友圈持续扩容,不仅改变了居民的生活方式和工作方式,还对襄阳旅游业产生了巨大贡献。1967……
打破价格束缚,雷军小米10Pro系列投入10亿元做研发IT之家2月13日消息今天下午14点开始,小米10Pro线上直播发布会举行,通过网络直播的形式,雷军正式面向公众发布了小米10、小米10Pro手机。小米10Pro手机搭载了最新……
一张图了解小米10Pro发布会IT之家2月13日消息小米10旗舰系列今日正式发布,除了新机外,发布会还推出了小米首款WiFi6路由器等新品,IT之家也做了相关报道,现在通过一张图了解一下整个发布会。小……
一图看懂小米10ProIT之家2月13日消息今天下午小米正式发布了2020年度旗舰产品小米10和小米10Pro,IT之家也做了大量报道,现在通过一张官方的图来了解一下两部手机。小米10系列手机……
暗黑破坏神不朽8周收入超1亿美元不到王者月收入的一半《暗黑破坏神:不朽》手游版的营收现已超过1亿美元,而拿下这个成绩花费了它们8周的时间。要了解这个数据是否能打,我们也可以参考下《精灵宝可梦GO》与《火焰纹章英雄》,前者达到1亿……
LV的女装怎么了?巴黎时装周接近尾声,北京时间3月6日迎来了压轴的LouisVuittons23秋冬大秀。秀未开始,热度已经爆棚。刘亦菲巴黎看秀造型、周冬雨露腰撞色造型、LV、LV的女装等十多个……
为什么要用小米10Pro到太空拍地球?天仪研究院给出答案IT之家2月15日消息2月13日下午,小米公司正式发布了小米10、小米10Pro手机,小米10Pro手机搭载了最新旗舰骁龙865处理器,全系采用LPDDR5内存、WiFi6、U……
她靠米莱出圈后又靠卫子夫这个角色一夜爆红!1984年,王珞丹出生于内蒙古赤峰,从小喜欢艺术的她有了报考了艺校的想法,起初父母持反对的意见,但自有主见的王珞丹还是通过了专业考试,她考上了赤峰幼儿师范的音乐专业,入校后的王……
19分大胜,马刺又赢了!8人得分上双,留给湖人的时间不多了马刺志在必得马刺输给了灰熊,结束了连胜,不过人们却看到了这支球队的斗志,面对几乎不可战胜的灰熊队,马刺最后只输了1分,甚至可以说,只是缺少一点运气。就连灰熊主教练也不得不……
小米10Pro手机MIUI11开发版计划公布2月17日起内测IT之家2月15日消息2月13日,雷军正式面向公众发布了小米10、小米10Pro手机。小米10Pro手机搭载了最新旗舰骁龙865处理器,全系采用LPDDR5内存、WiFi6、U……
青未了爱情诗之,依然依然作者:酷峰我今天在家喝茶,休闲忽然想起和你一起走过的路那路的尽头黑暗路上面覆盖冰雪是冬的冰雪是你我心中的苦难你我曾走过的路依……
免费福利,小米10Pro可领取一年的1TB云空间更新:《(补)小米10Pro会员免费领取一年1TB云空间办法》IT之家2月14日消息2月13日,雷军正式面向公众发布了小米10、小米10Pro手机。小米10Pro手机搭载……