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

HashMap的实现原理以及面试官的提问

2017-12-13 20:46 113 查看
ashMap:按照特性来说明一下,储存的是键值对,线程不安全,非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提供的线程更加安全。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: