HashMap的基本源代码分析1.HashMap的基本存储结构JDK1.7以前采用的存储结构是数组链表JDK1.8后数组链表红黑树2.HashMap实现的原理1.put )方法2.get ) )方法。 3.HashMap源代码分析
在面试中经常听到HashMap,今天我们将分析和说明HashMap的基础源代码
1.HashMap基础上采用的存储结构JDK1.7以前采用的存储结构是数组链表
我们知道链表的优点是适合添加和删除,但由于存储的数据过多会降低搜索效率,因此针对搜索效率低下的问题,改进了HashMap的存储结构。
JDK1.8之后采用的是数组链表的红黑树,保留了JDK1.7添加删除效率高的优点。 通过添加红黑树,也提高了搜索效率。
)1)首先,说明红黑树:红黑树是指自平衡二叉树,搜索效率高。 红黑树具有以下特征。
1 )每个节点只有红色和黑色两种颜色
2 )根节点必须为黑色
3 )每个叶节点都是黑色的空节点
4 )从根节点到叶节点,不能出现两个红色节点
5 )从任意一个节点出发,到其下子节点的路径中包含黑节点的数量相同。
2.HashMap实现的原理HashMap基于hashing的原理,通过提供put (和get )方法来存储和获取对象。
1.put ) )方法。 键-值对的值传递给put (方法时,调用hashCode )方法计算hashCode,并找到要保存的bucket的位置。
2.get ) )方法。 如果要检索对象,请使用关键对象的equals方法找到正确的键值对,并返回值。 HashMap使用链表解决碰撞问题,发生碰撞时,对象将存储在以下节点上:
3.HashMap源代码分析1 .默认初始化容量为16(2的n次方),最大容量为2^30
2 .默认加载因子0.75,乘以数组容量,用于指示元素的数量应该增加多少才能扩展容量
*0.75原因:
(1)小于0.75时,0.5时,阵列长度达到一半时容量扩大,空间利用率降低;
)2)大于0.75、0.8时混列冲突概率较高,影响查询效率。
3 .链表长度超过8时,转换为红黑树。
4 .红黑树元素数量减少到6个后退化为链表
5 .要将链表转换为红黑树,除了有阈值的限制外,还有数组容量必须至少达到64才能进行木材化的限制。 这是为了避免数组扩展与木材化阈值之间的冲突。
6.HashMap的源代码如下: (来源于知乎)。
public class HashMapK,V extends AbstractMapK,V implements MapK,v,Cloneable,Serializable { //序列号专用扩展longsstable //最大容量:2^30,超过2^30时staticfinalintmaximum _ capacity=130; //默认填充因子(加载因子) staticfinalfloatdefault _ load _ factor=0.75 f; 如果//桶上的节点数大于该值,则转换为红黑色树staticfinalinttreeify _ threshold=8; 如果//桶上的节点数小于此值,则树将在链表staticfinalintuntreeify _ threshold=6; //桶中结构转换为对应于红黑树的表的最小大小staticfinalintmin _ tree ify _ capacity=64; //存储元素的数组,始终是2的乘方倍数transient Nodek,v[] table; //结构源代码//分析存储特定元素的transient Setmap.entryk,v entrySet集//存储元素的数量,注意这不等于数组的长度。 transient int size; 每次扩展更改//映射结构时,计数器transient int modCount; //如果实际大小(容量)填充率)超过阈值,则扩展int threshold; //加载因子final float loadFactor; }