我的hash底层实现原理_第1页
我的hash底层实现原理_第2页
我的hash底层实现原理_第3页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一个长度为 呢。一般情况是通过NGYNQK_ RKT 获得,也就是元素的QK_的哈希值对数组长度取模得到.GYN3GV很不解,一个线性的数组怎么实现按键值对来存取数据呢?这里 .GYN3GV.GYN3GV类 +TZX_,其重要的属性,从属性QK_明显的看出来 +TZX_ 就是 .GYN3GV 键值对实现的一个基础 数组,这个数组就是 +TZX_AC,3GV 里面的内容都保存在 +TZX_AC里面XGTYOKTZ 二、.GYN3GV上面说到 .GYN3GV NGYN#QK_NGYN)UJK 这个NGYN)UJK一个长度为 呢。一般情况是通过NGYNQK_ RKT 获得,也就是元素的QK_的哈希值

2、对数组长度取模得到.GYN3GV很不解,一个线性的数组怎么实现按键值对来存取数据呢?这里 .GYN3GV.GYN3GV类 +TZX_,其重要的属性,从属性QK_明显的看出来 +TZX_ 就是 .GYN3GV 键值对实现的一个基础 数组,这个数组就是 +TZX_AC,3GV 里面的内容都保存在 +TZX_AC里面XGTYOKTZ 二、.GYN3GV上面说到 .GYN3GV NGYN#QK_NGYN)UJK 这个NGYN)UJK方法这里不详述只要理解每个QK_NGYN是一个固定OTJK#NGYN +TZX_AC+TZX_AOTJKC # 值 取值时 .GYN3GV 的底层实现原一、.GYN3GV够

3、,希望在查询关键字的时候不经过任何比较,一次存取便能得到所查 。因此, 须在关键字和其对应的 位置间建立对应的关系 LL 被称为哈希函数,按此 建立的表为哈希表。关键在于哈希意思就是:关键字位置是有关键字的内容决定的数据结构中有数组和链表来实现对数据,但这两者基本上是两区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为5 ;数组的区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达5(4。链表的特点是:寻那能不能综合两者的特性,做出一种寻址容易删除也容易的数据结构是肯定的,这就要提起的哈希表。哈希表(GYN ZGHR)便。法 拉链法,key,value

4、,XKZXT( 疑问:如果两个QK_通过NGYN +TZX_ACRKTMZN得到的OTJK相同,会不会有XKZXT( 疑问:如果两个QK_通过NGYN +TZX_ACRKTMZN得到的OTJK相同,会不会有覆盖?这里 .GYN3GV提到过+TZX_类里面有一个TKZ性,作用是指下一个+TZX_。打个比方, 第一个键值对进来,通过计算其QK_NGYN得到的OTJK# +TZX_A C T也等于 ,现在怎么办?.GYN3GVTKZ +TZX_ACOTJK TKZ+TZX_AC);发现OTJK# 的地方存取了 ( ) 三个键值对他们通过 TKZ 这个属在一起。所以疑问不用担心。也就是说数组的元素。到

5、这里为止,.GYN3GVVHIVZ1QK_ GRK OL QK_# XKZXTVZ,UX4RR1K_GRK ! RR总是放在数组的第一个链表 遍历链表LUX +TZX_1$K#ZGHRKAOC!K #TR!K#KTKZ 5HPKIZ 如果 QK_ 在链表中已存在,则替换为新 GRKOL KNGYN#NGYN Q#KQK_ #QK_bbQK_KWGRYQ URJGRK #KKGRK#YZNOYXKZXTSUJ)UTZ XKZXTUOJ NGYN 1 QK_ GRK HIQKZ/TJK a+TZX_1$K#IKZTJKCTTZX_1$NGYN QK_ GRK K ! 参数K +TZX_ 如果 YK

6、 超过 ZNXKYNURJ,则扩充 ZGHRK 大小。再散列OL YOK $# XKYOK ZGHRKRKTMZN当然 .GYN3GV 里面也包含一些优化方面的实现,这里也说一下。比如:+TZX_AC的长度一定后,随着 SGV 里面 数据的越来越长,这样同一个 OTJK 的链就会很长,会不会影响性能?.GYN3GV 里面设置一个因子,随着 SGVO#ONGYN ZGHRKRKTMZN NGYN # NGYNQK_NGYN)UJK OTJK#NGYN +TZX_ACNGYN#QK_NGYN)UJK ( )-VHIMKZ5HPKIZ( )-VHIMKZ5HPKIZQK_ OL QK_# XKZXT

7、 MKZ,UX4RR1K_ 先定位到数组元素,再遍历该元素处的链表LUX +TZX_1$ K# ZGHRKAOTJK,UXNGYN ZGHRKRKTMZNK # 5HPKIZOL KNGYN#NGYN Q#KQK_ #QK_bbQK_KWGRY XKZXT K XKZXTc( )RQK_ 的存TRR QK_总是存放在+TZX_AC数组的第一个元素 VXOGZKVZ,UX4RR1K_GRK LUX +TZX_1$K#ZGHRKAC!K #TRR!K#KTKZ URJGRK #KKGRK#YZNOYXKZXTSUJ)UTZ GJJ+TZX_ TRR GRK XKZXTVXOGZKMKZ,UX4RR

8、1K_ LUX +TZX_1=while(capacitycapacity=this.loadFactor=threshold=)(capacity*table=newinitialCapacity 如果两个不同对象的 hashCode 相同,这种现象。开放定址法(线性探测再散列,二次探测再散列,伪随机探测再散列Javahashmaprehashtable voidnewCapacity)EntryoldTable=if(oldCapacity threshold EntrynewTable=newoldCapacity=capacity=HashMapkey 应该对应EntryZKYNURJ

9、 TK)GGI_ RUGJ,GIZUX *XGTYLKXYGRRKTZXOKYLXUSIXKTZZGHRK UJZXGTYLKX+TZX_ACTKGHRK +TZX_ACYIZKYNURJ TK)GGI_ RUGJ,GIZUX *XGTYLKXYGRRKTZXOKYLXUSIXKTZZGHRK UJZXGTYLKX+TZX_ACTKGHRK +TZX_ACYI#TK)GVGIOZ_ # TKGHRK GHRKP# !PYXIRKTMZN!P +TZX_1 $ K # YXIAOL K # JU +TZX_1$TKZ#K O#OTJK,UXKNGYN TK)GVGIOZ_KTKZ#GHRTKGH

10、RKAOC#K! K # TKZ!cNORK K #cccZXGTYLKX TKGHRK ZGHRK # TKGHRK!.GYN:GHRK.GYN3GV区VHIIRGYY.GYNZGHRKKZKTJYXOSVRKSKTZY.GYN:GHRK.GYN3GV区VHIIRGYY.GYNZGHRKKZKTJYXOSVRKSKTZY3GV VHIIRGYY .GYN3GVKZKTJY HYZXGIZ3GV OSVRKSKTZY 3GV.GYNZGHRK 中的方法是同步的,而 .GYN3GV 中的方法在缺省情况下是非同步的。即是说,在多线程应用程序 .GYNZGHRK.GYN3GV,则需要额外的同步机制。

11、但.GYN3GV 的同步问题可通过 )URRKIZOUTY 的一个静态方法得到解决: 3GV )URRKIZOUTY _IUTOKJ3GV3GV 3 这个方法返回一个同步的 3GV,这个 3GV 封装了底层的 .GYN3GV 的所有方法,使得底层的 .GYN3GV 即使是GYNZGHK 中,QK_ 和 GRK 都不允许出现 TRR 值能由 MKZ 方法来判断 .GYN3GV 中是否存在某个键, 而应该用 IUTZGOTY1K_ 方法来判断.GYNZGHRK、.GYN3GV 都使用了 /ZKXGZUX。而由于历史原因,.GYNZGHRK 还使用了+TSKXGZOUT的方式 哈希值的使用不同,.G

12、YNGHRK 直接使用对象的 NGYN)UJK。而 .GYN3GV 重新计算 NGYN 值。.GYNZGHRK 和 .GYN3GV 它们两实现方式的数组的初始大小和扩容的方式。.GYNGHRK 中 NGYN 数组默大小是 ,增加的方式是 URJ 。.GYN3GVNGYN 数组的默认大小是 ,而且一定是 的指数。.GYNZGHRK 与 YN3GV 的区YN3GV 融合了 NGYNZGHRK 和 NGYNSGV 二者的优势NGYNZGHRK 是做了同步的,NGYNSGV 未考虑同步。所以 NGYNSGV 在单线程情况下效率较高。NGYNZGHRK 在的YN3GV 正是为了解决这个问题而诞生的YN3

13、GV 锁的方式是稍微细粒度的。 YN3GV将NGYN表分为 个桶(默认值,但是 NGYNZGHRK 每次同步执行的时候都要锁住整个结构在 .GYN3GV 中,TRR 可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为 TRR。当 MKZ 方法返回 TRR 值时,即可以表示 .GYN3GV 中没有该键,也可以表示该键所对应的值为 TRR。因此,在 .GYN3GV 中试想,原来 只能一个线程进入,现在却能同时 个写线程进入(之后会提到乎是完全的并发操作,而写操作锁定的粒度又非常细,比起之前又更加快速(些。只有试想,原来 只能一个线程进入,现在却能同时 个写线程进入(之后会提到乎是完全的并发操作,而写操作锁定的粒度又非常细,比起之前又更加快速(些。只有在求

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论