- HashMap概述
HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
- HashMap的数据结构
HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。在jdk1.8后引入了红黑树。
HashMap里面实现一个静态内部类Entry,其重要的属性有 key , value,
next,从属性key,value我们就能很明显的看出来Entry就是HashMap键值对实现的一个基础bean,我们上面说到HashMap的基础就是一个线性数组,这个数组就是Entry[],Map里面的内容都保存在Entry[]里面。
- 重要参数
loadFactor : 负载因子 默认0.75
initialCapacity : 初始化容量16,最大是(1 << 30)1073741824
table : Entry<K,V>[] table 是用来存储数据的数组
Entry<K,V> 是HashMap的一个内部类,链表结构
- HashMap的扩容
当hashmap中的元素越来越多的时候发生hash冲突的几率就越来越高,这时就要对其进行扩容,什么时候扩容呢?当容量达到了当前总容量乘上loadFactor的数量时就要对其扩容,在hashmap中一次是扩容两倍。
- 红黑树的引入
在jdk1.8中引入了红黑树,当一个索引下的链表长度达到8时,就会将这个链表转换为红黑树。这样大大提高了hashmap的性能,以及减少了hash冲突。
- 存元素
当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么就根据equels比较key是否相等,如果相等替换为新的value值。否则在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。