HashMap:
HashMap的数据结构: 可以称为散列表, 结构是 :数组 + 链表[树]-> 当链表>= 7 的时候, 链表转为树
put 方法:
1、通过key 调用hashcode 得出 hash 值 ;
2、判断map是否为null 或只长度是否为0,如果为真,则 reszie() 数组 ;
3、根据hash[int]值 与 数组长度 -1 的值 进行 & 运算, 定位到 key 所在位置 进行判null
4、如果为null,则直接在此位置插入数据;
5、如果不为null,判读 key所在位置的对象的和hash 值 和要插入的hash 值 是否相等,并且判断key是否相等(== 和equals);
5-1、为真, 则直接返回新插入的对象数据;
5-2、继续判断插入的位置是否为[treeNode]树状链表,为真,则调用插入的相关方法(putTreeVal),此处数据结构个人理解为红黑树;
5-3、如果不为树状链表,则进行循环比较,从链表的头开始进行逐个比较;
5-3-1、如果链表头的 next 为null,则直接插入;此时如果链表长度大于等于7,则转为树状链表(调用 treeifyBin()方法)并调出循环;
5-3-2、如果链表中的数据对象和插入的数据对象的hash值相等,且key相等(== 和equals),则直接调出循环;
6、如果插入的对象已经存在,只有当key 对应的值为null 的时候进行赋值,并返回插入对象的value;
7、记录修改次数 ++ ;
8、判断map此时的size+1 后 是否大于阀值,大于则进行 resize() 扩容;
9、移除map 之前的数据
get 方法:
1、通过key 调用hashcode 得出 hash 值 ;
2、根据hash值与 数组长度 -1 的值 进行 & 运算, 定位到 key 所在位置
3、如果链表头的hash值和key 相等(== 和equals),则直接返回该值;
4、如果链表中有多个,则判断链表数据结构
4-1、如果为树状链表,则调用方法getTreeNode() 获取对应值并返回;
4-2、如果为 链表,则从链表头开始遍历 获取对应的值 并返回 ;