标签:hash HashMap 对象 bucket 链表 数组 原理
HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当将键对象和值对象传递给put()方法时,它调用键对象的hash方法来得到hash值然后根据hash&(length-1)运算得到bucket数组下标值,然后根据下标找到bucket位置来储存值Entry对象。如果两个不同的键对象通过hash算法得到相同bucket 数组下标即相同的bucket位置,此时会发生‘碰撞’值对象储存在同一个bucket位置的链表下一个节点上(如果链表的长度大于8则会引入红黑树来存储值Entry对象)。之后判断HashMap存储的数量是否大于12(16*0.75)如果大于12则rehashing(扩容)到之前的两倍大小bucket数组,并且重新调整map的大小,并将原来的对象放入新的bucket数组中。当获取对象时,get()方法通过键对象的hash方法来得到hash值然后根据hash&(length-1)运算得到bucket数组下标值,然后根据下标找到bucket位置后,会调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象。Java8新加,当链表长度大于8的时候使用红黑树存储Entry对象(8是通过泊松算法经过一系列的计算得到当链表长度为8时候的概率(0.00000006)趋近于0)。
标签:hash,HashMap,对象,bucket,链表,数组,原理 来源: https://blog.csdn.net/qq_36428821/article/details/114444114
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。