JDK1.8之前HashMap在多线程操作的时候会造成环形结构,导致死循环。具体成环原因和怎么成环,参考这篇写得很好的博客:为什么HashMap线程不安全
JDK1.8开始,HashMap由链表的头插法改变成了尾插法,因此不再会造成死循环,改成尾插法也是为了能够更好的维护jdk1.8中HashMap的红黑树结构。
JDK1.8和之前版本多线程操作HashMap都会在put的时候导致数据不一致或者丢失和覆盖。参考文章:https://blog.csdn.net/Hzt_fighting_up/article/details/78737468
在JDK1.8中还进行了对resize方法的优化,在JDK1.8之前是对key重新进行hash计算得出在新扩容的table中的位置 hash&(newCap-1),而在JDK1.8中是按照扩容后的规律计算得到数据在扩容后的位置(即:扩容后的位置 = 原位置 or 原位置+旧容量)
JDK1.7和JDK1.8中HashMap的区别强烈建议看这篇文章,非常全面:Java源码分析:HashMap 1.8 相对于1.7 到底更新了什么?