jdk1.8 HashMap 实现 数组+链表/红黑树

转载至 http://www.cnblogs.com/leesf456/p/5242233.htmlhtml

1、前言数组

  在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于以前的jdk,而Java8的HashMap对以前作了较大的优化,其中最重要的一个优化就是桶中的元素再也不惟一按照链表组合,也可使用红黑树进行存储,总之,目标只有一个,那就是在安全和功能性完备的状况下让其速度更快,提高性能。好~下面就开始分析源码。安全

2、HashMap数据结构数据结构

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  说明:上图很形象的展现了HashMap的数据结构(数组+链表+红黑树),桶中的结构多是链表,也多是红黑树,红黑树的引入是为了提升效率。因此可见,在分析源码的时候咱们不知不觉就温习了数据结构的知识点,一箭双雕。函数

3、HashMap源码分析源码分析

  3.1 类的继承关系 布局

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

  能够看到HashMap继承自父类(AbstractMap),实现了Map、Cloneable、Serializable接口。其中,Map接口定义了一组通用的操做;Cloneable接口则表示能够进行拷贝,在HashMap中,实现的是浅层次拷贝,即对拷贝对象的改变会影响被拷贝的对象;Serializable接口表示HashMap实现了序列化,便可以将HashMap对象保存至本地,以后能够恢复状态。性能

  3.2 类的属性 优化

 

 View Code

 

 

  说明:类的数据成员很重要,以上也解释得很详细了,其中有一个参数MIN_TREEIFY_CAPACITY,笔者暂时还不是太清楚,有读者知道的话欢迎指导。spa

  3.3 类的构造函数

  1. HashMap(int, float)型构造函数

 View Code

  说明:tableSizeFor(initialCapacity)返回大于initialCapacity的最小的二次幂数值。

 View Code

  说明:>>> 操做符表示无符号右移,高位取0。

  2. HashMap(int)型构造函数。

 View Code

  3. HashMap()型构造函数。

 View Code

  4. HashMap(Map<? extends K>)型构造函数。

 View Code

  说明:putMapEntries(Map<? extends K, ? extends V> m, boolean evict)函数将m的全部元素存入本HashMap实例中。 

 View Code

  3.4 重要函数分析

  1. putVal函数  

 View Code

  说明:HashMap并无直接提供putVal接口给用户调用,而是提供的put函数,而put函数就是经过putVal来插入元素的。

  2. getNode函数

 View Code

  说明:HashMap并无直接提供getNode接口给用户调用,而是提供的get函数,而get函数就是经过getNode来取得元素的。

  3. resize函数  

 View Code

  说明:进行扩容,会伴随着一次从新hash分配,而且会遍历hash表中全部的元素,是很是耗时的。在编写程序中,要尽可能避免resize。

  在resize前和resize后的元素布局以下

  说明:上图只是针对了数组下标为2的桶中的各个元素在扩容后的分配布局,其余各个桶中的元素布局能够以此类推。

4、针对HashMap的思考

  4.1. 关于扩容的思考

  从putVal源代码中咱们能够知道,当插入一个元素的时候size就加1,若size大于threshold的时候,就会进行扩容。假设咱们的capacity大小为32,loadFator为0.75,则threshold为24 = 32 * 0.75,此时,插入了25个元素,而且插入的这25个元素都在同一个桶中,桶中的数据结构为红黑树,则还有31个桶是空的,也会进行扩容处理,其实,此时,还有31个桶是空的,好像彷佛不须要进行扩容处理,可是是须要扩容处理的,由于此时咱们的capacity大小可能不适当。咱们前面知道,扩容处理会遍历全部的元素,时间复杂度很高;前面咱们还知道,通过一次扩容处理后,元素会更加均匀的分布在各个桶中,会提高访问效率。因此,说尽可能避免进行扩容处理,也就意味着,遍历元素所带来的坏处大于元素在桶中均匀分布所带来的好处。若是有读者有不一样意见,也欢迎讨论~

相关文章
相关标签/搜索