首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
没烦恼_
江汉大学 后端
发布于湖北
关注
已关注
取消关注
@美汁源果粒橙:
【Android面试】Java| HashMap面试题整理
一、HashMap有用过吗?您能给我说说他的主要用途吗?答:有用过,我在平常工作中经常会用到HashMap这种数据结构,HashMap是基于Map接口实现的一种键-值对 <key,value>的存储结构,允许null值,同时非有序,非同步(即线程不安全)。HashMap的底层实现是数组 + 链表 + 红黑树(JDK1.8增加了红黑树部分)。它存储和查找数据时,是根据键key的hashCode的值计算出具体的存储位置。HashMap最多只允许一条记录的键key为null,HashMap增删改查等常规操作都有不错的执行效率,是ArrayList和LinkedList等数据结构的一种折中实现。二、您能说说HashMap常用操作的底层实现原理吗?如存储put(K key, V value),查找get(Object key),删除remove(Object key),修改replace(K key, V value)等操作。答:调用put(K key, V value)操作添加key-value键值对时,进行了如下操作:判断哈希表Node<K,V>[] table是否为空或者null,是则执行resize()方法进行扩容;根据插入的键值key的hash值,通过(n - 1) & hash当前元素的hash值 & hash表长度 - 1(实际就是 hash值 % hash表长度)计算出存储位置table[i];如果存储位置没有元素存放,则将新增结点存储在此位置table[i];如果存储位置已经有键值对元素存在,则判断该位置元素的hash值和key值是否和当前操作元素一致,一致则证明是修改value操作,覆盖value即可;当前存储位置即有元素,又不和当前操作元素一致,则证明此位置table[i]已经发生了hash冲突,则通过判断头结点是否是treeNode,如果是treeNode则证明此位置的结构是红黑树,已红黑树的方式新增结点;如果不是红黑树,则证明是单链表,将新增结点插入至链表的最后位置,随后判断当前链表长度是否 大于等于 8,是则将当前存储位置的链表转化为红黑树。遍历过程中如果发现key已经存在,则直接覆盖value。插入成功后,判断当前存储键值对的数量大于阈值threshold 是则扩容。三、hash冲突(或者叫hash碰撞)是什么?为什么会出现这种现象,如何解决hash冲突?答:hash冲突:当我们调用put(K key, V value)操作添加key-value键值对,这个key-value键值对存放在的位置是通过扰动函数(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)计算键key的hash值。随后将这个hash值 % 模上 哈希表Node<K,V>[] table的长度 得到具体的存放位置。所以put(K key, V value)多个元素,是有可能计算出相同的存放位置。此现象就是hash冲突或者叫hash碰撞。hash冲突的避免:既然会发生hash冲突,我们就应该想办法避免此现象的发生,解决这个问题最关键就是如果生成元素的hash值。Java是使用“扰动函数”生成元素的hash值。四、HashMap的容量为什么一定要是2的n次方?答:因为调用put(K key, V value)操作添加key-value键值对时,具体确定此元素的位置是通过 hash值 % 模上哈希表Node<K,V>[] table的长度 hash % length 计算的。但是"模"运算的消耗相对较大,通过位运算h & (length-1)也可以得到取模后的存放位置,而位运算的运行效率高,但只有length的长度是2的n次方时,h & (length-1) 才等价于 h %length。而且当数组长度为2的n次幂的时候,不同的key算出的index相同的几率较小,那么数据在数组上分布就比较均匀,也就是说碰撞的几率小,相对的,查询的时候就不用遍历某个位置上的链表,这样查询效率也就较高了。五、您能说说HashMap和HashTable的区别吗?1)容器整体结构:HashMap的key和value都允许为null,HashMap遇到key为null的时候,调用putForNullKey方法进行处理,而对value没有处理。Hashtable的key和value都不允许为null。Hashtable遇到null,直接返回NullPointerException。2) 容量设定与扩容机制:HashMap默认初始化容量为 16,并且容器容量一定是2的n次方,扩容时,是以原容量 2倍 的方式 进行扩容。Hashtable默认初始化容量为 11,扩容时,是以原容量 2倍 再加 1的方式进行扩容。即int newCapacity = (oldCapacity << 1) + 1;。3) 散列分布方式(计算存储位置):HashMap是先将key键的hashCode经过扰动函数扰动后得到hash值,然后再利用 hash & (length - 1)的方式代替取模,得到元素的存储位置。Hashtable则是除留余数法进行计算存储位置的(因为其默认容量也不是2的n次方。所以也无法用位运算替代模运算),int index = (hash & 0x7FFFFFFF) % tab.length;。由于HashMap的容器容量一定是2的n次方,所以能使用hash & (length - 1)的方式代替取模的方式计算元素的位置提高运算效率,但Hashtable的容器容量不一定是2的n次方,所以不能使用此运算方式代替。4)线程安全(最重要):HashMap 不是线程安全,如果想线程安全,可以通过调用synchronizedMap(Map<K,V> m)使其线程安全。但是使用时的运行效率会下降,所以建议使用ConcurrentHashMap容器以此达到线程安全。Hashtable则是线程安全的,每个操作方法前都有synchronized修饰使其同步,但运行效率也不高,所以还是建议使用ConcurrentHashMap容器以此达到线程安全。
点赞 16
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
04-27 10:16
已编辑
重庆大学 安全工程师
所以,你们许给我们的远大前程呢
过了小半辈子,突然停下来的时候,回头一看,发现身边每个人真的都在忍辱负重。看到前几天的猿辅导事件,年纪轻轻倒在连续加班18天后的夜晚,算起来,那位应该和我差不多岁数。几周以前,关系要好的实习生突然问我,深圳税前几千块的offer可不可以接,她找了很久的工作,从最开始认为会一切顺利到如今开始思考是否足够将就才能落地。而这样的女生,她的bg是9本+知名港硕+几段并不水的实习经历。还有更早一点的时候,和组里的实习生吃饭,热气腾腾的日料店里,小姑娘很惆怅地说,不知道毕业之后第一份工作的着落在哪里。现实的拷问如此残酷,虚长一些年岁的姐姐们,再也没有办法安慰说,有时候,人只要内心平静就可以。而在昨天夜里,...
聪明的加菲猫又在摸鱼:
好多时候真的感觉不是我们不努力,而是努力的人真的太多了,永远有人在你前面
真的是验证了只要肯吃苦就有吃不完的苦这句话。。
点赞
评论
收藏
分享
04-25 10:17
已编辑
饿了么_后端开发
饿了么暑期实习
目前虽然实习已经进入尾声了,******************** ******* 针对26届的同学进行秋招正式批预热玻璃心 讲讲饿了么暑期实习的感觉, 一个小白进入到大厂里,客观来说阿里的新人需要很强的学习能力+适应能力+抗压能力,因为大厂新人入职进来就是一个新的螺丝钉,需要你自己快速磨合自己适应岗位上手工作,所谓的师傅、主管大体上很难遇到一个非常负责、有耐心、心善的人的,因为都是工作,who care you,如果有遇到一个很有责任的主管、师傅的话,那你非常的幸运,捡到宝了,一定要抱紧他的大腿,快速从他身上学习与成长,个人觉得一个好的主管、师傅的评判标准,不仅仅是他告诉了你怎么快速上手工...
饿了么成长空间 144人发布
点赞
评论
收藏
分享
03-17 19:26
字节跳动_后端开发
逆天滴滴hr,是不是都不爱理人?
一个是这样也就算了,第二个还是这样
haru832:
说不定是hr被踢了
点赞
评论
收藏
分享
03-11 21:46
西北大学 Java
如此逆天薪资猜猜是哪家公司
请问这是谁 Deepseek和我说是华为 我不信
河和静子:
这只是实习工资,我学长北大通班博一的,他同学被这家天天发邮件让他去实习,一个月10w
点赞
评论
收藏
分享
04-28 18:00
已编辑
武汉科技大学 C++
暑期实习记录(附c++面经)
教育:26毕业,武汉双非,延毕实习经历:0竞赛经历:icpc 区金 + 若干银方向是 c++后台开发,技能上写的c++,操作系统,计算机网络,socket编程项目:15445, webserver前排汇总(截止4.28)美团:4.7官网投递,4.12笔试,4.13AI面,4.24被捞,4.27一面,约二面主动终止流程快手:4.7官网投递,挂简历腾讯音乐:4.7官网投递,简历评估小米:4.7官网投递,简历评估小红书:4.7官网投递,挂简历bilibili:4.7官网投递,挂简历高德:4.7官网投递,挂简历腾讯:4.7官网投递,内推了一下,4.9测评,4.10一面,4.17二面,4.19三面,4....
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
暑期后端高频问题汇总
7.5W
2
...
左手敲代码的程序员,不配拥有offer吗?
7.4W
3
...
想听实话吗,校招ssp聊聊大厂客户端
3.6W
4
...
五一假期,弯道超车时间表
9400
5
...
后端简历上最值得写的项目
8960
6
...
北京到底有谁在啊?
8770
7
...
五一别写你那破开源代码了
7572
8
...
快手投诉后续- HR把我拉黑了!
6569
9
...
美团/饿了么/京东 配送端面经
6491
10
...
拼多多服务端信息确认
6013
创作者周榜
更多
正在热议
更多
#
设计人如何选offer
#
98162次浏览
687人参与
#
找工作,行业重要还是岗位重要?
#
7270次浏览
95人参与
#
五一之后,实习真的很难找吗?
#
44980次浏览
318人参与
#
盲审过后你想做什么?
#
12502次浏览
113人参与
#
外包能不能当跳板?
#
22111次浏览
191人参与
#
领导秒批的请假话术
#
9768次浏览
74人参与
#
考研可以缓解求职焦虑吗
#
20762次浏览
244人参与
#
五一假期,你打算“躺”还是“卷”?
#
27826次浏览
411人参与
#
找工作前vs找工作后的心路变化
#
7153次浏览
64人参与
#
面试等了一周没回复,还有戏吗
#
115363次浏览
1073人参与
#
硬件人,你被哪些公司给挂了
#
46583次浏览
722人参与
#
应届生薪资多少才合理?
#
3075次浏览
24人参与
#
牛友们的论文几号送审
#
27195次浏览
623人参与
#
写简历别走弯路
#
714265次浏览
7850人参与
#
你喜欢工作还是上学
#
37482次浏览
409人参与
#
如果有时光机,你最想去到哪个年纪?
#
43244次浏览
766人参与
#
如何缓解入职前的焦虑
#
171863次浏览
1267人参与
#
每人推荐一个小而美的高薪公司
#
72832次浏览
1357人参与
#
如果不工作真的会快乐吗
#
101062次浏览
866人参与
#
大疆的机械笔试比去年难吗
#
69580次浏览
603人参与
牛客网
牛客企业服务