首页 > 编程知识 正文

hashmap为什么用红黑树,HashMap的底层原理

时间:2023-05-03 10:33:48 阅读:15488 作者:3535

HashMap的基础是通过数组和链表的结构实现的。

对于HashMap实例,有两个参数会影响性能:“初始容量”和“加载因子”。

初始容量只有创建哈希表时的容量。 加载因子是指哈希表容量在自动增加之前填满多少的度量。 如果哈希表中的条目数超过了加载系数与当前容量的乘积,则通过调用rehash方法将容量加倍。

通俗地说,例如,要加水,请先找水桶的容量。 负荷因子例如是指控制装在这个水桶里的水不超过水桶的容量。 例如,如果负荷因子为0.75,加水时这个水桶最多可以进入3/4。 如果定义了这个,水桶中可以包含水=水桶的容量*负荷因子

如果水桶的容量为40负荷因子为0.75,则水桶中最多可以装40*0.75=30的水

如果你放的水多于30的话,应该用大一点的水桶。 rehash是增加水桶容量的方法

HashMap包含几个重要的成员变量: table、size、threshold、loadFactor和modCount。

table是Entry[]数组类型,Entry实际上是单向链表。 散列表中的所有“键-值对”都存储在条目数组中。

size是HashMap的大小,是HashMap保存的键-值对的数量。

threshold是HashMap阈值,用于确定是否需要调整HashMap的容量。 如果threshold的值='容量*加载因子',并且HashMap中存储的数据数量达到threshold,则必须将HashMap的容量加倍。

加载因子是加载因子。

modCount用于实现故障快速机制。

混洗映射计算key的混洗值。 如果散列值相同,则会发生散列冲突,HashMap使用链表解决冲突。

示例:

publicclasshashmaptest { publicstaticvoidmain (字符串[ ] args ) {MapString,字符串映射=new hashmap ); map.put(key,) value ); system.out.println (map.get (' key ' ); }1、put方法分析

//键值对方法如果publicvput(kkey,V value )//key为null,则混列值为0,表示此条目位于索引为0的位置,即table[0]if ) key==null 遍历table[i]的Entry,返回//hash值所在的索引位置,计算//key的hashCode的hash值intI=indexfor(hash,table.length ),其中key相同e!=null; e=e.next({objectk; if(e.hash==hash((k=e.key )|key.equals ) k ) ) { V oldValue=e.value; e .值=值; e .记录访问(this; 返回载荷值; (//修改标记1,元素添加操作modCount; addentry(hash,key,value,I ); //返回空值,用于将包含特定密钥、值和散列值的条目添加到特定桶; //key为空的元素privatevputfornullkey(vvalue ) ) for ) entryk,V e=table[0]; e!=null; e=e.next(if ) e.key==null ) { V oldValue=e.value; e .值=值; e .记录访问(this; 返回载荷值; } }模具计数; 详细信息(0,null,value,0 ); 返回空值; }/* * * addsanewentrywiththespecifiedkey, valueandhashcodeto * thespecifiedbucket.itistheresponsibilityofthis * methodtoresizethetableifappropriate.* * subclassoverridesthistoalterthebehaviorofputmethod.*/voidaddentry (int hash,K key,V value,int bucketIndex ) { EntryK,} if(size=threshold ) resize(2*table.Length ); ) 2、get方法分析

/**返回与映射的密钥相对应的值,如果映射中不包含该密钥,则为null*/publicvget(objectkey ) ) if ) key==null ) /获取密钥为null的值计算//key的散列值遍历与//数组中的散列值相对应的Entry链表,如果Entry元素的散列值等于hashCode的散列值,且key等于搜索到的密钥,则返回此Entry=null; e=e.next({objectk; if(e.hash==hash((k=e.key )==key || key.equals(k ) k ) ) ) return e.value; }返回空值; ) } qq:1992093891

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