HashMap

来源:互联网 发布:淘宝不能结算怎么回事 编辑:程序博客网 时间:2024/06/05 03:28

转载自漫画算法

转载自微信公众号“算法爱好者”


摘要

1.put方法的原理
2.get方法的原理
3.HashMap的长度

正文:

HashMap是一个用于存储key-value键值对的集合,每一个键值对也叫作Entry。这些键值对分散存储在一个数组中,这个数组就是HashMap的主干。

1.put方法的原理

比如调用 hashMap.put("apple", 1);插入一个key为“apple”的元素,这时候,需要一个hash函数来确定Entry的位置。
index = Hash("apple");
假定,最后计算出的index是2,那么结果如下:


但是,因为HashMap的长度是有限的,当插入的Entry越来越多时,再完美的Hash函数也会出现index冲突的情况,比如:

这时候利用链表来解决。
HashMap的每个元素不只是Entry对象,也是一个链表的头结点。每个Entry对象通过Next指针指向它的下一个Entry节点。当新来的Entry映射到冲突的数组位置时只需插入到对应的链表即可。

需要注意的是,新来的Entry节点插入链表时,使用的是头插法。是因为HashMap的发明者认为,后插入的Entry被查找的可能性更大。

2.get方法的原理

比如调用hashMap.get("apple");
首先会把输入的key做一次Hash映射,得到对应的index。
由于刚才所说的Hash冲突,同一个位置有可能匹配到多个entry,这时候就要顺着对应链表的头节点,一个一个向下来查找。
假设我们查找的key是apple:

3.HashMap的长度

默认长度是16,并且每次自动扩展或者手动初始化时,长度都是2的幂。
选择2的次幂是服务于从key映射到index的Hash算法(key的hashcode和(length-1) 进行位运算,也就是从hashcode的后几位定位entry的index)



原创粉丝点击