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)。
相关文章
- 02-17HashMap,HashTable ,LinkedHashMap,TreeMap的区别
- 02-17socket原理详解
- 02-17socket原理详解
- 02-17Socket原理详解
- 02-1706 MR执行流程和原理
- 02-17DHCPv6原理与配置
- 02-17mr原理简单分析
- 02-17【GAN与NLP】GAN的原理 —— 与VAE对比及JS散度出发
- 02-17计算机组成原理 - 速记版(为coursera.org上pku课程总结)
- 02-17bfd的配置及原理