本篇为威力加强升级版本,读到最后,有惊吓
1:hashmap简介(如下,数组-链表形式)
HashMap的存储结构
图中,紫色部分即代表哈希表,也称为哈希数组(默认数组大小是16,每对key-value键值对其实是存在map的内部类entry里的),数组的每个元素都是一个单链表的头节点,跟着的绿色链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中。
2:hashmap原理(即put和get原理)
2.1 put原理
1.根据key获取对应hash值:int hash = hash(key.hash.hashcode())
2.根据hash值和数组长度确定对应数组引int i = indexFor(hash, table.length); 简单理解就是i = hash值%模以 数组长度(其实是按位与运算)。如果不同的key都映射到了数组的同一位置处,就将其放入单链表中。且新来的是放在头节点。
2.2 get原理
1.通过hash获得对应数组位置,遍历该数组所在链表(key.equals())
3:hashcode相同,冲突怎么办?
“头插法”,放到对应的链表的头部。
3.1:为什么是头插法(其设计原理是什么)?
因为HashMap的发明者认为,后插入的Entry被查找的可能性更大(因为get查询的时候会遍历整个链表)。
4.hashmap的默认数组长度是多少?
默认为16
4.1 为什么?
之所以选择16,是为了服务于从key映射到index的hash算法(看下面)。