您的位置:首页 > 职场人生

HashMap 面试的提问

2018-08-06 21:46 295 查看
HashMap:首先按照特性来说明一下,储存的是键值对,线程不安全,非 Synchronied,储存的比较快,能够接受 null。按照工作原理来叙述一下,Map 的 put(key,value)来储存元素,通过 get(key)来得到 value 值,通过 hash 算法来计算 hascode 值,根据 hashcode 值来决定 bucket(桶),储存结构就算哈希表。

提问:两个 hashcode 相同的时候会发生说明?
hashcode 相同,bucket 的位置会相同,也就是说会发生碰撞,哈希表中的结构其实有链表(LinkedList),这种冲突通过将元素储存到LinkedList 中,解决碰撞。储存顺序是仿在表头。

提问:如果两个键的 hashcode 相同,如何获取值对象?
如果两个键的 hashcode 相同,我们通过 key.equals()找到 LinkedList 中正确的节点。

提问:如果 HashMap 的大小超过了负载因子?怎么办?
默认的 HashMap 里面的负载因子大小是 0.75,将会重新创建一个原来 HashMap 大小的两倍 bucket 数组。

提问:重新调整的话会出现什么问题?
多线程情况下会出现竞争问题,因为你在调节的时候,LinkedList储存是按照顺序储存,调节的时候回将原来最先储存的元素(也就是最下面的)遍历,多线程就好试图重新调整,这个时候就会出现死循环。

提问:为什么要用 String、Wrapper 类,来作为键值对?
因为他们一般不是不可变的,源码上面 final,使用不可变类,而且重写了 equals 和hashcode 方法,避免了键值对改写。提高 HashMap 性能。

提问:使用 CocurrentHashMap 代替 Hashtable?
可以,但是 Hashtable 提供的线程更加安全。

水平有限,若有问题请留言交流!

互相学习,共同进步 :) 转载请注明出处谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: