JAVA高级基础(12)---HashMap的数据结构及内部实现

版权声明:如需转载请标明出处 https://blog.csdn.net/yj201711/article/details/84495863

 HashMap

HashMap的工作原理

Java 8 的 HashMap 对之前做了较大的优化,其中最重要的一个优化就是桶中的元素不再唯一按照链表组合,也可以使用红黑树进行存储,总之,目标只有一个,那就是在安全和功能性完备的情况下让其速度更快,提升性能。

java8开始引入了红黑树,HashMap的数据结构(数组+链表+红黑树),桶中的结构可能是链表,也可能是红黑树,红黑树的引入是为了提高效率。基于HashTable来进行存储,就是为了加快查询速度。

散列表(Hash table,也叫哈希表),是根据关键码值(Ket Value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫散列函数,存放记录的数组叫散列表。

HashMap的数据结构

说明:上图很形象的展示了HashMap的数据结构(数组 + 链表+ 红黑树),桶中的结构可能是链表,也可能是红黑树,红黑树的引入是为了提高效率。

HashMap的内部实现 

搞清楚HashMap,首先需要知道HashMap是什么,即它的存储结构--字段;其次是弄明白它能干什么,即它的功能实现--方法。

存储结构-字段

从结构实现来讲,HashMap是 数组 + 链表+ 红黑树实现的,如下图所示:

(1)从源码可知,HashMap类中有一个非常重要的字段,就是Node[] table,即哈希桶数组,明显它是一个Node的数组,我们来看Node是何物

Node是HashMap的一个内部类,实现了Map.Entry 接口,本质是就是一个映射(键值对),上图中的每个黑色圆点就是一个Node对象。

扫描二维码关注公众号,回复: 4233117 查看本文章

(2)HashMap就是使用哈希表来存储的。

功能实现-方法

HashMap的内部功能实现很多,我们主要根据

key 获取哈希桶数组索引位置、put方法的详细执行、扩容过程三个具有代表性的点深入展开。

2、分析 HashMap 的 put 方法

 小结:

  1. 扩容是一个特别耗性能的操作,所以当程序员在使用HashMap的时候,估算map的大小,初始化的时候给一个大致的数值,避免map进行频繁的扩容。
  2. 负载因子是可以修改的,也可以大于1,但是建议不要轻易修改,除非情况非常特殊。
  3. ConcurrentHashMap是线程安全的,支持并发操作
  4. JDK1.8引入红黑树大程度优化了HashMap的性能。

猜你喜欢

转载自blog.csdn.net/yj201711/article/details/84495863
今日推荐