首页 > 编程知识 正文

hashmap的底层实现原理,java io面试题

时间:2023-05-05 20:37:17 阅读:15483 作者:397

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; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。