# HashMap

39 阅读1分钟

前言

标题JDK1.7JDK1.8
存储数组+链表数组+链表+红黑树
链表超过8链表红黑树(链表超过8且数组长度超过64)
节点结构Entry<K,V>implements Map.Entry<K,V>Node<K,V>implements Map<K,V>
插法头插法(扩容环化容易造成死循环)尾插法

HashMap是一个基于Hash散列算法,以键值对形式存储的数据结构。

JDK1.8之前的HashMap使用的是拉链法(Chaining)作为冲突解决策略

JDK1.8之后用红黑树作为替代链表的冲突解决策略。

当哈希表中的元素数量超过一定阈值时,HashMap会自动进行扩容,保证较低的负载因子,提高性能。

HashMap使用负载因子来控制扩容。负载因子是Hashmap中键值对数和HashMap容量的比值。

HashMap的初始容量是16,负载因子是0.75。当HashMap中键值对数达到16*0.75=12时,HashMap就会进行扩容.

HashMap的扩容将容量扩大为原来的2倍。如:当HashMap容量为16时,扩容后容量为32。

HashMap扩容的原因是,当HashMap负载因子达到一定值时,HashMap查询性能会下降,当HashMap容量较小,键值对较多时,会导致哈希冲突概率增加。

HashMap会在负载因子达到一定值时进行扩容,提高查询性能。

HashMap扩容步骤:

  1. 创建一个新的HashMap,容量为原来的2倍
  2. 将原HashMap中所有键值对复制(hash算法)到新HashMap中
  3. 将原Hashmap置为空。