HashMap的实现原理基于哈希表,jdk1.8中HashMap存储结构是 数组+链表+红黑树,HashMap基于Hash算法实现数据的存储和获取,通过put(key,value)存储,get(key)来获取。当传入key时,HashMap会根据key.hashCode()计算出hash值,根据hash值定位到具体的数组存储位置,如果相同的位置已经存在hash值,称为hash冲突,这里处理hash冲突的办法是链表法,判断内容是否相同,不相同放到链表的尾部,当链表长度大于8时会转换为红黑树。下面是HashMap实现原理的详细步骤:
创建初始容量和扩容
HashMap在创建时会有一个初始容量,默认为16。这个容量实际上是一个数组的长度,称为“哈希桶”或“散列表”。当HashMap中的元素个数超过数组大小与负载因子(默认为0.75)的乘积时,HashMap会进行扩容,将数组长度加倍,并重新计算每个元素在数组中的位置。
计算哈希值
当向HashMap中添加键值对时,首先使用哈希函数来计算键的哈希值。这个哈希值用于确定键值对在数组中的索引位置。
处理哈希冲突
哈希冲突是指不同的键可能计算出相同的哈希值,从而映射到数组中的同一个位置。为了解决哈希冲突,HashMap在每个数组位置上都维护了一个链表或红黑树。当哈希冲突发生时,新的键值对会被添加到该位置上的链表或树的末尾。
如果链表长度超过了某个阈值(默认为8),则链表会转化为红黑树以提高查找性能。当树节点数量少于某个阈值(默认为6)时,树会转换回链表以节省内存。
查找键值对
在HashMap中查找键值