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

hashmap底层实现原理以及常见的面试问题

2017-11-19 10:53 866 查看
hashmap算法优劣标准
1.分布均匀

2.尽量避免冲突


关于hashMap的几个问题

1、hashing的概念
这个是一个hash算法,将Key对象通过hashing的到需要存储值对象的位置bucket。

2、HashMap中解决碰撞的方法
根据key的hashcode得到存储位置bucket,有可能不同的key得到的位置一样这样就出现了hash碰撞。这样就引入了每一个bucket中的一个链表结构来解决碰撞,hashMap如果发生hash碰撞则将键值对象存在链表的下一个节点。

3、equals()和hashCode()的应用,以及它们在HashMap中的重要性
当两个不同的键对象的hashcode一样,他们会存储在同一个bucket位置的链表中,通过遍历这个链表再根据键对象的equals方法用来找到存放在链表中的键值对(Entry)对象。get方法用到equals和hashcode方法,put则用到hashcode方法。

4、不可变对象的好处
用不可变对象作为key,是非常合适的。

1)如果存放时key对象的hashcode和获取时这个key对象的hashcode不一致时则无法获取值对象。

2)不可变对象是线程安全的,减少碰撞的几率。


5、HashMap多线程的条件竞争
当多个线程同时试图去调整hashmap大小的时候,存储在链表的中的元素会反过来,因为移动到新的bucket位置的时候,hashmap并不会将元素放到链表的尾部,而是放在头部,这样是为了避免尾部遍历。这样就可能发生死循环。

6、重新调整HashMap的大小
如果put元素之后发现hashmap的size>当前size*负载因子(默认0.75)时就会对hashmap进行扩0容。扩容过程是创建一个原来map大小的2倍bucket数组,通过新的hash算法将原来的Entry对象存放到新的bucket数组中。这个过程是rehashing过程,这个是非常耗时的,因此在开发中尽量选定合适的初始hashMap大小,尽量减少扩容的发生。

7、hashMap底层数据结构到底是怎样的
hashMap包含一个bucket数组和每一个bucket对应的链表结构,每一个K-V对象存放在这个链表中,这个链表结构主要用来解决hash碰撞后键值对象存储问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java hashmap hash hashcode
相关文章推荐