java集合相关

Java中的HashMap

2017-06-10  本文已影响1613人  miaoLoveCode

几天前,一个正在疯狂码代码的午后,钉钉上一个小伙伴问我:“你知道HashMap是在什么时候做bucket的初始化的么?”,我一边关注着手头的代码,一般含糊了一句:“new HashMap()的时候”,这个时候我想了想貌似不对,返回去看了看源码,发现并不是的。接下来就从几个方面分析分析JDK中HashMap的具体实现。

前言

在分析HashMap之前,先简单的提几个问题,以供大家思考:

如果各位老司机们有对这些问题持有疑问的,那可以带着这些问题来看后文的相关内容。接下来就分别分析JDK 7和JDK 8中HashMap的具体实现。

HashMap实现分析

数据结构

JDK中的HashMap采取开链法来处理冲突,所以:

  1. 在JDK 7 中,HashMap的数据结构是数组+链表;

  2. 在JDK 8 中,HashMap的数据结构由数组+链表变为数组+(链表或者rbtree)

JDK 7中的HashMap

到这里JDK 7的重要实现差不多分析完了,接下来我们再来看看JDK 8中相关实现。

JDK 8中的HashMap

注:具体的红黑树实现将会在后续文章中给出,在本文不做详细分析。

到这里put方法的主要流程就结束了,接下来我们来看看JDK 8是如何来对HashMap扩容的。

总结

到这里为止HashMap的相关实现分析就结束了,不难看出,JDK 8 比起JDK 7比较大的优化在:

  1. 引入rbtree,在bucket节点下链表长度 > 8时将链表编程rbtree;
  2. 优化hash和resize,减少resize带来的hash性能消耗。
上一篇 下一篇

猜你喜欢

热点阅读