jdk1.7时,hashmap的实现原理是数组+链表,而且元素采用头插法。

jdk1.8时,hashmap的实现原理转换为数组+链表/红黑树,当链表长度>8,且数组长度>64时,链表将转化为红黑树。而且元素的新增采用尾插法。之所以转为红黑树,是为了提高搜索效率。

jdk1.7时,并发hashmap的原理是分段锁,不同的线程会锁一部分数据也就是segment,这样就减少了不同线程之间的竞争。

jdk1.8时,并发hashmap的原理是通过cas和synchronized实现的,synchronized每次只锁定当前数组或红黑树的首节点。

hashmap的一些细节,初始容量是16。当元素数量 > 当前容量*负载因子时,会进行扩容操作,容量变更为原来得2倍。