hash 是非线程安全的
hashMap 使用数组+链表的形式
针对key 进行hashCode得到之后 会和hashMap的长度进行AND操作
快速得到key在数组中的位置。key==null的时候 hashCode=0。
因此hashMap需要重写equal和hashCode。但是非key不用object就可

hashMap 链表长度超过8(泊松分布)会转换成红黑树,少于6会转换成链表
hashMap 在数组长度64以下不生成红黑树 只会使用链表
hashMap 满载因子0.75 (泊松分布)

hashMap的resize

(1).1.8以后hashMap没有死循环问题,但是还会有可能丢数据 因为1.8以后的hashMap是尾插法,不是头插法
(2).1.8的扩张是根据最后一位是1还是0来判断需要 迁移+n,还是保留原来的位置
(3).在JDK1.7的时候是先扩容后插入的,这样就会导致无论这一次插入是不是发生hash冲突都需要进行扩容,如果这次插入的并没有发生Hash冲突的话,那么就会造成一次无效数据迁移,但是在1.8的时候是先插入再扩容的,优点其实是因为为了减少这一次无效的数据迁移,原因就是如果这次插入没有发生Hash冲突的话,那么其实就不会造成扩容,但是在1.7的时候就会急造成扩容 。