首页 > 编程知识 正文

javahash算法,什么是hash

时间:2023-05-06 00:21:23 阅读:21598 作者:4424

针对混列算法和混列冲突的Hash算法:是一种基于所设置的混列函数h(key )和冲突处理方法将关键字映射到有限地址区间的算法。 所以Hash算法也被称为散列算法,散列算法。

Hash表:通过混列算法后得到的有限地址区间上的集合。 (数据存储位置和密钥之前的一定关系(h(key )=stored_value_hash ) ) ) ) ) 652与此相对

用于Hash冲突:计算的数据是无限的h(key ),key属于(-,,映射到区间的是有限的,所以一定要有两个key:key1,key2,h )

开放地址法开放地址法也被称为再散列法,基本的想法是,p=h(key )冲突时,以p为基础再次hash,p1=H),p1再次冲突时,以p1为基础,不冲突的散列地址PP 因此,开放地址法所需的混列表的长度在需要存储的要素以上,并且由于存在重新混列,所以只能标记被删除的节点,实际上不能删除节点。

缺点:容易产生堆积问题; 如果在不适合大数据存储的插入过程中多次发生冲突; 必须删除与要删除的元素冲突的其他元素,很复杂。

哈希方法(双哈希、多重哈希)提供多个不同的哈希函数,当r1=h1 ) key1)发生冲突时,重新计算r2=h2 ) key1),直到冲突消失。 这样一来,虽然不容易产生堆,但计算时间会变长。

链地址法(拉链法)链地址法:将哈希值相同的元素构成同义词的单链表,将单链表的开头指针存储在哈希表的第I单元中,检索、插入、删除主要是同义词链表链表法适用于频繁插入和删除的情况。 HashMap采用链寻址法解决hash冲突。 (如果链表长度大于或等于8,则过渡到红黑树) ) ) ) ) ) )。

创建公共溢出区域,将哈希表分为公共表和溢出表,如果发生溢出,则将所有溢出数据一起放置在溢出区域。

HashMap中的处理冲突接下来是HashMap的put方法:

finalvputval(inthash,K key,V value,boolean onlyIfAbsent,boolean evict ) { NodeK,V[] tab; NodeK,V p; int n,I; 如果if () tab=table )==null||(n=tab.Length )==0) hash数组为空,则初始化n=(tab=resize () ).length。 if () p=tab[I=(n-1 ) hash )==null计算落入hash桶的位置,如果当前桶为空,则直接节点tab(I )=newnode ) hash、key、value、 k; if(p.hash==hash ) (k=p.key )==key||(key!=nullkey.equals(k ) ) (如果key已经存在,则取代元素e=p; 如果elseif(pinstanceoftreenode ) /当前为树结构(不是链表),则树中包含元素e=(treenode k,v ) p ).puttre eval (this,tab,hash ) 如果添加Vey )的else { //当前结构仍然存在,请遍历链表,直到到达末尾,或者找到与for (替换intbincount=0的key相同的元素; 到达bincount(//末尾,添加元素,链表长度达到8时,红黑树if((e=p.next ) null ) p.next=newnode ) hash、key、value、nule if (bincount=tree ify _ threshold-1 )/-1for1STTreeifybin(tab,hash ); 布雷克; () ) () ) ) )在链表中,我们发现有与key相同的元素。 照原样替换,breakif(e.hash==hash ) ) (k=e.key )==key|(key!=nullkey.equals(k ) ) (break; p=e; }if(e!=null ()//如果元素已经存在,则确定是否替换v old value=e.value (onlyifabsent ); if (! olyifabsent|||old value==null (e.value=value; afternodeaccess(e; 返回载荷值; } }模具计数; //如果容量超过阈值,则返回大小阈值(if ); 自动识别(evict; 返回空值; }

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