目录
底层原理
高并发下的hashmap
总结
https://zhuanlan.zhihu.com/p/78079598
1、底层原理:put、get;
2、为甚hashMap的长度要为2的幂次;
https://zhuanlan.zhihu.com/p/81587796(解析详细)
1、Hashmap在插入元素过多的时候需要进行Resize,Resize的条件是
HashMap.Size >= Capacity * LoadFactor。
2、Hashmap的Resize包含扩容和ReHash两个步骤,ReHash在并发的情况下可能会形成链表环(本质是因为1.7版本put采用的头插法。因为作者考虑到后插入的元素更可能先被用到,头插就更方便get,提高效率,不过反而造成了线程不安全。)
HashMap之所以在并发下的扩容造成死循环,是因为,多个线程并发进行时,因为一个线程先完成了扩容,将原的链表重新散列到自己的表中,并且链表变成了倒序,后一个线程再扩容时,又进行自己的散列,再次将倒序链表变为正序链表。于是形成了一个环形链表,当get的时候,造成死循环。
虽然在JDK1.8中,Java的开发小组修正了这个问题,但是HashMap始终存在着其他的线程安全问题。所以在并发情况下,我们应该使用HastTable或者ConcurrentHashMap来代替HashMap。