HashMap :
实现原理:基于Map接口实现,数据结构采用数组 + 链表 + 红黑树,元素以键值对的形式存储,使用key的二次hash定位数组的位置和key是否重复。HashMap中使用可允许key和value为null, key为null只能出现一次。HashMap在多线程的情况下是不安全的,并且存储的元素是无序的;
源码理解:
get操作
1.判断表是否为空,或者带检查的桶是否为空;
2.检查第一个node的key hash是否为要查找的原属,如果是的还直接返回;
3.获取下一个节点判断类型是否是树节点,如果是使用getTreeNode()获取结果;
4.如果是链表遍历链表获取key的值;
put操作:
1.表为空或者长度为0 ,使用resize 初始化表,为表分配空间
2.二次散列出的桶为空直接插入元素
3.如果桶不为空,判断首节点的hash是否与插入的key的hash相同,如果相同直接赋值替换;
4.判断下一个点的类型是否是TreeNode,是putTreeVal写入节点;
5.遍历链表并判断key的hash是否存在,存在赋值替换;并且判断链表的节点数是否大于8,大于8使用treeifyBin将链表转为红黑树。
6.不存在将元素节点添加到链表最后;