HashMap原理

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)。

上一篇:Android开发三年只有7k,一年三连跳涨到30w!


下一篇:Boltdb学习笔记之〇--概述