请详细描述下JDK1.7和JDK1.8两个版本中的HashMap扩容机制
时间: 2023-09-10 18:08:16 浏览: 187
HashMap是Java中常用的一种数据结构,用于存储键值对。在JDK1.7和JDK1.8中,HashMap的扩容机制有以下区别:
JDK1.7中的HashMap扩容机制:
1. 初始化:HashMap初始化时会创建一个Entry数组,数组大小为2的n次方(默认为16)。
2. 增加元素:当往HashMap中添加元素时,会根据key的hashCode()方法计算出数组下标,如果该位置已经有元素,则将新的元素插入到链表的头部,否则直接插入数组。
3. 扩容:当HashMap中元素个数超过负载因子(默认为0.75)*数组大小时,就需要进行扩容。扩容时会将数组大小翻倍,并将原有的元素重新分配到新数组中。在JDK1.7中,扩容时采用头插法,即将链表的结点插入到新数组对应的链表头部。
4. 并发问题:在并发环境下,由于头插法可能会导致链表成环,所以需要进行额外的处理来避免死循环。在JDK1.7中,采用了synchronized关键字来对put操作进行同步。
JDK1.8中的HashMap扩容机制:
1. 初始化:HashMap初始化时会创建一个Node数组,数组大小为2的n次方(默认为16)。
2. 增加元素:当往HashMap中添加元素时,会根据key的hashCode()方法计算出数组下标,如果该位置已经有元素,则将新的元素插入到链表或红黑树的尾部,否则直接插入数组。
3. 扩容:当HashMap中元素个数超过负载因子(默认为0.75)*数组大小时,就需要进行扩容。扩容时会将数组大小翻倍,并将原有的元素重新分配到新数组中。在JDK1.8中,扩容时采用了尾插法,即将链表或红黑树的结点插入到新数组对应的链表或红黑树的尾部。
4. 红黑树:在JDK1.8中,当链表长度达到一定阈值(默认为8)时,会将链表转化为红黑树,从而提高HashMap的查找效率。
5. 并发问题:在JDK1.8中,使用了CAS和synchronized来对put操作进行同步,从而提高了并发性能。
阅读全文