首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
10-31 02:00
门头沟学院 Java
26秋招阿里健康后端二面
1.部门业务介绍+实习相关 2.智力题:16瓶水,1瓶有毒,1小时时间,找出14瓶没有毒的水。已知小白鼠喝完毒水后在1h内会死亡,求:找出14瓶无毒的水至少需要多少只小白鼠? 3.思路题:长度为n的数组,数字有正负,求下标连续的最大子数组和?说解题思路和算法思想即可。 4.场景题:有一段超大文本,需要统计其中每个单词的词频。请从单机内存可以存放、单机内存无法存放两种角度说说思路和使用到的数据结构。 5.追问:在多机情况下,你提到用分治和堆结构存储topN的词频,那存不存在一种情况:有一个单词不存在于任何一个单机的topN集合中,但其在多机中所有词频的总和可以进入到最终的topN集合中去?这种情...
查看13道真题和解析
点赞
评论
收藏
分享
11-03 17:42
门头沟学院 Java
团子捡漏?
最近,听说团子给很多人开了白菜劝退价,网上大佬很多人直接发帖子,说拒了,再看看boss这个,难道真的捡漏开始了?
牛泪中:
ks也这么骗我,说是简历稀缺,实则露头就秒,我的投递记录滚轮要划动两次才能见底
秋招开始捡漏了吗
点赞
评论
收藏
分享
10-22 19:44
门头沟学院 Java
剪个头发的功夫 两个oc!
剪完头发一看手机 同时发了
面了100年面试不知...:
那我得去剪个头
点赞
评论
收藏
分享
11-03 00:05
华东师范大学 Web前端
百度Web前端开发一面
1.挑一个项目介绍一下 2.请解释浏览器的渲染过程,包括从接收 HTML 到页面显示的关键步骤,以及百度搜索结果页如何优化首屏渲染速度? 3.JavaScript 中的原型与原型链是什么?如何通过原型实现继承?举例说明原型链的查找机制。 4.什么是跨域?百度地图 API在前端调用时如何解决跨域问题?常见的跨域解决方案有哪些? 5.React 中的虚拟 DOM 是什么?它与真实 DOM 相比有哪些优势?虚拟 DOM 的 Diff 算法核心逻辑是什么? 6.CSS 选择器的优先级如何计算?百度首页导航栏样式(如hover 效果)若被其他样式覆盖,如何排查并解决? 7.如何实现一个防抖(deboun...
查看11道真题和解析
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
java后端学习经验分享(大三进大厂版)
1.6W
2
...
26届0实习秋招总结
8425
3
...
超级大月亮来了, 都来评论区许愿,包灵
7641
4
...
企鹅后端日常实习一面
6858
5
...
秋招丑闻爆料爆料
5784
6
...
《以下言论仅代表个人观点,与百度无关》
5470
7
...
摸爬滚打,我也一定要离开华为
3797
8
...
那个绩点倒数,挂科7门的女生最后考上了985研究生
3481
9
...
26届双非本拿下美团SSP的真实感受
3429
10
...
十一月,希望有个好的开始
3223
创作者周榜
更多
正在热议
更多
#
今年秋招是回暖还是遇冷
#
11308次浏览
75人参与
#
实习教会我的事
#
36112次浏览
316人参与
#
京东开奖
#
439581次浏览
2484人参与
#
我来点评面试官
#
4793次浏览
37人参与
#
如果不考虑收入,你最想做什么工作?
#
35699次浏览
211人参与
#
你实习是赚钱了还是亏钱了?
#
12740次浏览
120人参与
#
商战,最累的是我们
#
24303次浏览
89人参与
#
京东工作体验
#
16740次浏览
96人参与
#
用一句话形容你的团队氛围
#
7851次浏览
107人参与
#
秋招开始捡漏了吗
#
48271次浏览
334人参与
#
同bg的你秋招战况如何?
#
162788次浏览
945人参与
#
找工作八股要背到什么程度?
#
7395次浏览
121人参与
#
考研人,我有话说
#
150118次浏览
1198人参与
#
你找工作是从容有余 or 匆忙滚爬?
#
4900次浏览
57人参与
#
三一重工求职进展汇总
#
21331次浏览
82人参与
#
硬件人,你被哪些公司给挂了
#
68676次浏览
932人参与
#
上班后,才发现大学__白学了
#
8106次浏览
53人参与
#
58同城求职进展汇总
#
38596次浏览
260人参与
#
机械人,你的第一份感谢信是谁给的
#
37907次浏览
346人参与
#
大学生该如何认清当下的就业环境?
#
107487次浏览
636人参与
#
今年秋招还有金九银十吗
#
30605次浏览
280人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务