HashMap

数组+链表
数组储存空间连续占用内存严重,因此控件复杂的很大,但是数组的二分查找时间复杂度小,寻址容易插入和删除困难 O(1)
链表存储区间离散,占用内存比较宽松,空间复杂度小但是时间复杂度大O(N) 寻址困难插入和删除容易

哈希表 综合两者特性,作出寻址容易,插入删除也容易的数据结构。 Hash Table,既满足查找方便,同时不用占据太多内存空间
哈希表实现方式很多,常用方法—-拉链法 裂解为链表的数组
image.png
(感觉数组长度是可以固定的,上图就是16位hash表)
每个元素存储的是一个链表的头结点,元素按照hash(key)%len存储到数组中,也就是元素的key的哈希值对数组长度取模得到 28%16=12 108%16=12

hashMap内部实现了一个静态内部类 Entry,其重要的属性有 key,value,next,从属性key,value能看出Entry就是HashMaP键值对实现的一个基础bean,hashMap的基础就是一个线性数组

存储时
int hash = key.hashCode();
int index=hash%Entry[].length;
Entry[index]=value;
取值时:
int hash=key.hashCode();
int index=hash%Entet[].length;
return Entery[index];

put方法时,相同的index会按链表的方式存储,new.next=old;Entry[index]=B; 数组中存储的是最后插入的元素

es6的map和set底层基于hashmap实现,当hashmap中的链表长度超过一定量转换为红黑树实现