链子,链表,链==》都表示链表
基于hashmap8
数组,链表,树?
* 在初始化一个hashmap的时候,他是一个数组。
* 在进行put的时候,会调用hash方法返回一个整型数字,也就是数组的下标,如返回6,表示put的元素放到数组角标为6的位置,不断的put,调用hash方法后肯定有几率再次返回6,再往6位置放新元素时发现已经存在其他元素,此情况就叫做hash冲突,这时就会扯一个链子出来,专业词链表,手法叫拉链法,链表有顺序,第一个插入的在链子的最后,最近插入的在链子最前
* 还在不断的put,还在不断hash冲突,结果链表越拉越长,为保证查询效率,将链表转为红黑树
完整形态的hashmap到底长啥样,能不能来个图理解下
* 没图 就是在转成树的时候,冗余了链表,两者的数据完全一样。get的时候,先判断树是否存在,存在则取树,不存在则取链表
* 想看源码的,TreeNode<K,V> 表示树 Node<K,V>表示链表
其实啊,在不断扩容的时候,hashmap还进行了扩容,咋扩的呢
* 就是数组长度*2,为啥是2呢,说不清道不明,反正这是目前最合适的值,大概的就是高位和地位运算,*2的时候可以尽可能的让地位运算时新老数组的元素下标不变
* 低位:原元素角标位置
* 高位:原元素角标+原数组长度
更深点,扩容时,对链和树做了啥
* 链子扯成了两条,分高位链的和地位链的。有树扯树,没树扯链子,有树有链子的情况下不管链子,树也是先扯成了2条新链子,处理逻辑和链表一模一样,然后在判断是否需要再次化为树
hashmap的那些参数表示啥含义
* 表知道,表记得,只晓得是目前的最优值,等哪天我要对他的源码进行优化了,就能记住理解为啥这么设置值了
为啥链转树是8呢
* 关键词:泊松分布,事件触发概率的分布图
* 对同一个map不断调用hash方法,返回相同整数的次数很难超过8次,概率为0.00000006,几乎不可能。
* 其实我进行了debug,就i++跑了8千万次的循环都没有树生成。为啥嘞,因为啊他有一个前提条件就是数组长度大于64 ,否则还是进行扩容
为啥hashmap7会死循环,8不会,为啥依旧线程不安全
* 首先呢,单线程不会有问题,多线程下,hashmap7多个线程操作同一个map,在put的时候采用头插法可能会造成链表头尾连在一起形成一个圆圈,在进行get操作的时候,就在圆圈里面死循环了。hashmap8改为尾插法,问题就是会造成数据的丢失
为啥一开始是头插,头插形成圆圈的原理
* 头插法考虑点:热点的新插入的数据可能会更早被get