HashMap底层原理及简单实现
HashMap可以用键值对来存储对象,所谓键值对,就是可以通过对象来寻找对象,是对数组索引的推广。 底层原理 存储结构 HashMap底层的实现采用了哈希表,基本结构是“数组+链表”。HashMap里面有一个叫table的Entry数组,Entry是一个用作链表节点的类,也就是说,数组的每个元素都对应着一个链表,结构如图所示: 存储过程 当调用HashMap的put方法时 首先,会计算key对象的哈希码,也就是调用它的hashcode()方法,一般是根据地址求出的。 然后,通过特定的算法计算出哈希码对应在 [0,数组长度-1) 区间内的哈希值,例如图中是让哈希码模16,求出对应的哈希值是15; 最后在table数组对应位置的链表中添加value对象(在添加的过程中会比较,将相同key值的对象覆盖掉) 注:两种最极端的计算哈希值算法:1.hashCode / hashCode 退化成一个链表 2.hashCode / 1退化成一个数组 注:为了提高效率,会将模运算换成位运算,当length是2的幂次时,hashCode & (length - 1)等效于hashCode % length 注:JDK8中,当链表长度大于8时,会将链表转化成一颗红黑树,提高查找效率 查找键值对过程 查找的过程类似于存储过程,只不过把存改为找到后返回。 根据key值求出hashCode