https://www.bilibili.com/video/av73968282?from=search&seid=1400532295507095115
周瑜老师讲的很好
1、hashMap机制
1.1、jdk1.7
数组(entity)+链表。
1.1.1、根据key计算hashCode值,然后对hashCode进行高位运算,最后和数组长度(初始容量)-1进行与运算,得到entity的存储位置。
1.1.2、多个对象的key计算出来的存储位置有可能一样,就是hash碰撞,这个时候就在相同的位置增加链表,链表扩容采用的是头插法,这样插入效率很高。
1.1.3、当key为null的时候,这个是指定位置的,就放在entity的第一个下标位置。
当相同的key的时候就会替换value的值,同时把oldValue返回。
初始容量的时候,是2的N次方,主要是在后期的hashCode的 &运算的时候,增强散列性。比如如果是0001 0000减去就是0000 1111,这样进行位运算就 取决于hashCode的位运算之后的值。如果指定初始容量是10,那么初始容量就是最接近10的2的N次方,16
1.2、jdk1.8
数组+链表+红黑树