结构:
数组+链表 +(>=1.8)红黑树
插入过程:
根据拿到key得hash值(并非直接拿hashCode,而是拿它的高位和低位进行重新计算得出全新的hash值,目的是为了减少hash碰撞),拿hash值根据数组长度-1(默认16)去得到数组索引。
当他拿到索引后会判断当前位置是否为空,为空则放入,不为空则找next,next不为空继续找next。假如放完元素后,该链表长度>8并且数组长度>=64 那么转红黑树。
hash碰撞的本质只是数组索引一样之后的处理
扩容:
当hashMap的元素数量 >= 数组长度*0.75,那么进行扩容原长度2倍(红黑树转链表是在扩容中进行的,并非在删除中,只判断长度<=6转链表,不判断64)。
线程不安全的原因:多个线程同时put元素时,扩容,可能会出现链表闭环