为什么面试要问hashmap 的原理
发布网友
发布时间:2022-03-29 14:05
我来回答
共1个回答
热心网友
时间:2022-03-29 15:34
HashMap
的工作原理
HashMap
,都知道哪里要用
HashMap
,知道
Hashtable
和
HashMap
之间的区别
,那么
为何这道面试题如此特殊呢?是因为这道题考察的深度很深。
这题经常出现在高级或中高级
面试中。投资银行更喜欢问这个问题,甚至会要求你实现
HashMap
来考察你的编程能力。
ConcurrentHashMap
和其它同步集合的引入让这道题变得更加复杂。让我们开始探索的
旅程吧!
先来些简单的问题
“你用过
HashMap
吗?”
“什么是
HashMap
?你为什么用到它?”
几乎每个人都会回答“是的”,然后回答
HashMap
的一些特性,譬如
HashMap
可以接
受
null
键值和值,而
Hashtable
则不能;
HashMap
是非
synchronized;HashMap
很快;
以及
HashMap
储存的是键值对等等。
这显示出你已经用过
HashMap
,
而且对它相当的熟
悉。但是面试官来个急转直下,从此刻开始问出一些刁钻的问题,关于
HashMap
的更多
基础的细节。面试官可能会问出下面的问题:
“你知道
HashMap
的工作原理吗?”
“你知道
HashMap
的
get()
方法的工作原理吗?”
你也许会回答“我没有详查标准的
Java API
,你可以看看
Java
源代码或者
Open JDK
。”
“我可以用
Google
找到答案。”
但一些面试者可能可以给出答案,
“
HashMap
是基于
hashing
的原理,
我们使用
put(key,
value)
存储对象到
HashMap
中,使用
get(key)
从
HashMap
中获取对象。当我们给
put()
方法传递键和值时,
我们先对键调用
hashCode()
方法,
返回的
hashCode
用于找到
bucket
位置来储存
Entry
对象。”这里关键点在于指出,
HashMap
是在
bucket
中储存键对象和
值对象,作为
Map.Entry
。这一点有助于理解获取对象的逻辑。如果你没有意识到这一点,
或者错误的认为仅仅只在
bucket
中存储值的话,
你将不会回答如何从
HashMap
中获取对
象的逻辑。这个答案相当的正确,也显示出面试者确实知道
hashing
以及
HashMap
的工
作原理。但是这仅仅是故事的开始,当面试官加入一些
Java
程序员每天要碰到的实际场景
的时候,错误的答案频现。下个问题可能是关于
HashMap
中的碰撞探测
(collision
detection)
以及碰撞的解决方法:
“当两个对象的
hashcode
相同会发生什么?”
从这里开始,真正的困惑开始了,一些面
试者会回答因为
hashcode
相同,
所以两个对象是相等的,
HashMap
将会抛出异常,
或者
不会存储它们。然后面试官可能会提醒他们有
equals()
和
hashCode()
两个方法,并告诉他
们两个对象就算
hashcode
相同,但是它们可能并不相等。一些面试者可能就此放弃,而
另外一些还能继续挺进,他们回答“因为
hashcode
相同,所以它们的
bucket
位置相同,
‘碰撞’会发生。因为
HashMap
使用
LinkedList
存储对象,这个
Entry(
包含有键值对的
Map.Entry
对象
)
会存储在
LinkedList
中。”这个答案非常的合理,虽然有很多种处理碰撞
的方法,这种方法是最简单的,也正是
HashMap
的处理方法。但故事还没有完结,面试
官会继续问:
“如果两个键的
hashcode
相同,
你如何获取值对象?”
面试者会回答:
当我们调用
get()
方法,
HashMap
会使用键对象的
hashcode
找到
bucket
位置,然后获取值对象。面试官
提醒他如果有两个值对象储存在同一个
bucket
,
他给出答案
:
将会遍历
LinkedList
直到找到
值对象。
面试官会问因为你并没有值对象去比较,
你是如何确定确定找到值对象的?除非面
试者直到
HashMap
在
LinkedList
中存储的是键值对,否则他们不可能回答出这一题。
其中一些记得这个重要知识点的面试者会说,
找到
bucket
位置之后,
会调用
keys.equals()
方法去找到
LinkedList
中正确的节点,最终找到要找的值对象。完美的答案!
为什么面试要问hashmap 的原理?
“HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。从这里开始,真正的困惑开始了,一些面试者会回答因为hashcode相同,所以两个对象是相等的,HashMap将会抛出异常,或者不会存储它们。然后面试官可能会提醒他们有equals()和hashCode两个方法,...
Java面试——话术:HashMap底层及相关知识点汇总
HashMap的工作原理是基于散列和链表或红黑树的机制,通过计算哈希值确定存储位置。为了减少碰撞,可以优化hashCode实现、使用不可变对象和合适的equals方法。选择红黑树而非二叉查找树,是因为红黑树能保持查询性能。当负载因子达到一定阈值,HashMap会扩容并重新调整。多线程环境需注意并发调整大小可能引发死循环。
java中HashMap和HashTable面试题问题,为什么hashmap是属于异步的呢?并...
HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题。Hashtable是个过时的集合类,存在于Java API中很久了。在Java 4中被重写了,实...
面试中如何回答HashMap的工作原理
hashmap是接受null值的,null值被放在数组的第一个元素当中,取出来的时候怎么处理呢?hashmap的工作原理?它的里面有一个Entry数组,在put时我们先根据key值计算出hashcode,进而计算出该元素在数组中的位置,将健值对封装在Map.Entry对象中,然后存储在数组中 若产生hash冲突怎么办?每个数组元素的位置...
HashMap实现原理
为了解决这个问题,HashMap引入了扩容与负载因子。以下是和扩容相关的一些概念和解释:Ps: 扩容要重新计算下标 , 扩容要重新计算下标 , 扩容要重新计算下标 ,因为下标的计算和数组长度有关,长度改变,下标也应当重新计算。在1.8及其以上的jdk版本中,HashMap又引入了红黑树。红黑树的引入被用于替换...
HashMap和HashSet的区别
1 HashMap和HashSet的区别是Java面试中最常被问到的问题。如果没有涉及到Collection框架以及多线程的面试,可以说是不完整。而Collection框架的问题不涉及到HashSet和HashMap,也可以说是不完整。HashMap和HashSet都是collection框架的一部分,它们让我们能够使用对象的集合。collection框架有自己的接口和实现...
java面试题详解(java面试题简书)
在看面试题的过程,你会遇到一些自己没接触过的或者以前没深入学习过的知识,例如最常问的HashMap内部实现原理,这就促使你得开始去看jdk的源码或者是学习一些新的东西。看源码是很重要的一步,起步很难,但是会让你收益良多,看源码的过程如果碰到无法理解的地方,可以百度看下别人的理解。我学习源码的过程中,看过几个...
为什么HashMap会产生死循环
HashMap死循环是一个比较常见、也是比较经典的面试题,在大厂的面试中也经常被问到。HashMap的死循环问题只在JDK1.7版本中会出现,主要是HashMap自身的工作机制,再加上并发操作,从而导致出现死循环。JDK1.8以后,官方彻底解决了这个问题。1、数据插入原理在分析原因之前,我先带大家了解一下JDK1.7中...
3分钟轻松理解单线程下的HashMap工作原理
1、HashMap中的关键属性要透彻理解HashMap原理,首先需要对以下几个关键属性有一个基本的认识。我们看到,HashMap的源码片段:第一个属性??loadFactor,它是负载因子,默认值是0.75,表示扩容前?。第二个属性??threshold?它是记录HashMap所能容纳的键值对的临界值,它的计算规则是负载因子??乘以?数组...
我的百度面经(共8次面试)
面试官说不是,引导说用栈实现递归。 问我栈中需要压入哪些数据。他说应该是方法参数,返回值,以及返回地址。 二面: 1 自我介绍,项目 10分钟过去 2 服务器如何负载均衡,有哪些算法,哪个比较好,一致性哈希原理,怎么避免DDOS攻击请求打到少数机器。 3 TCP连接中的三次握手和四次挥手,四次挥手的最后一个ack的作...