简介
HashMap是开发中常用的一种无序、线程不安全的集合。在Java1.7中hashMap采用的是数组加链表的结构来存储数据(1.8中增加了红黑树,主要是为了增加遍历查询效率,时间复杂度O(Logn),链表时间时间复杂度O(n)),每一个hashMap都会维护一个table[],类型为Entry<k,v> ,通过键值对来存储具体的k,v数据,Entry实际上是一个单向链表结构,维护了一个next指针,来解决hash碰撞问题,因为HashMap是按照Key的hash值来计算Entry在HashMap中存储的位置的,如果hash值相同,而key内容不相等,那么就用链表来解决这种hash冲突。jdk1.7的hashMap源码还是比较简单的,感兴趣的同学可以自己去研究下,到了jdk1.8中代码逻辑稍微复杂下,想研究jdk1.8 hashMap源码可以参考我另一篇文章,详细的介绍了1.8中hashMap源码原理。今天主要跟大家一起分析下1.7中hashMap并发扩容下可能造成死循环的问题。
代码分析
1.7中hashMap的put()方法逻辑还是不复杂的 ,感兴趣的自己可以研究下,我们直接找到hashMap扩容关键方法transfer()去研究分析。
通过源码可以清晰的看出在jdk1.7中transfer()方法主要是遍历我们的table数组,获取到每个index中的Entry链表,内层循环,遍历链表中的每一个ent