HashMap的底层源码及数据结构解析

关于HashMap,它是咱们使用很是多的集合容器,它是基于哈希表的 Map 接口的实现,以key-value的形式存在。实际上HashMap是一个“链表散列”,以下是它数据结构:数组

HashMap数据结构

HashMap底层实现仍是数组,只是数组的每一项都是一条链。数据结构

在hashMap里有两个重要因子,初始容量(Capacity)加载因子(loadFactor)性能

这两个参数是影响HashMap性能的重要参数,其中容量表示哈希表中桶的数量,初始容量是建立哈希表时的容量,加载因子是哈希表在其容量自动增长以前能够达到多满的一种尺度(默认是0.75),它衡量的是一个散列表的空间的使用程度,加载因子越大表示散列表的装填程度越高,反之愈小。对象

从源码来看,能够分为如下步骤:blog

HashMap是一个Node类型的数组table,初始化为Null。索引

  1. 建立对象是,先将加载因子loadFactor初始化为0.75,其他成员不变。
  2. 建立元素时,先将元素的key的哈希值获取后,计算出在数组中的索引位置,分为如下几种状况:a.若没有其余值,则直接存放。b.若相等,则覆盖。c.若不相等,则继续判断,看是不是树状结构仍是链表,根据不一样状况处理。
  3. 若须要扩容,分两种状况:a.第一次添加,容量为16,临界值为容量*加载因子。 b.若后续添加,是容量的2倍,临界值也为以前临界值的2倍。
  4. 当链表中节点数>=7 && capacity>=64 则将链表变成树结构。

不过,在JDK1.8后发生了变化接口

版本 结构 table数据类型 初始容量
jdk7 数组+链表 Entry 16
jdk8 数组+链表+红黑树 Node 0

这两种在容量上的区别是jdk7初始化table时容量为16(饿汉式),而jdk8建立对象时并无初始化,而是第一次添加元素时table初始化为16(懒汉式)。ci

相关文章
相关标签/搜索