HashMap 在 jdk 1.7 和 1.8 的区别?
时间: 2023-12-01 13:27:48 浏览: 131
在 JDK 1.7 中,HashMap 内部使用数组和单向链表来实现哈希表。但是,当链表长度达到一个阈值时,链表会转化为红黑树以提高性能。这个阈值的默认值是 8。此外,JDK 1.7 中的 HashMap 采用“头插法”来解决哈希冲突,这意味着新插入的元素会被放在链表的头部。
在 JDK 1.8 中,HashMap 的内部实现发生了较大的变化。首先,当链表长度达到一个阈值时,链表不再转化为红黑树,而是采用了一个新的数据结构——链表和红黑树的混合结构。这个结构称为“链表+红黑树”,它可以在保证平均时间复杂度为 O(1) 的情况下,处理链表长度较长的情况。此外,JDK 1.8 中的 HashMap 采用“尾插法”来解决哈希冲突,这意味着新插入的元素会被放在链表的尾部。
总的来说,JDK 1.8 中的 HashMap 在性能和可扩展性方面都有了重大的改进,可以更好地满足实际应用的需求。
相关问题
hashMap的数据结构jdk1.7和1.8的区别 java
1.7和1.8的HashMap在实现上存在一些区别,主要是在解决哈希冲突时的方式不同。
在1.7中,HashMap使用的是“拉链法”解决哈希冲突。即当发生哈希冲突时,将冲突的元素存储在链表中,同时将链表头节点的内存地址存储在桶里。这种方式的缺点是:当链表长度过长时,会导致查询效率变慢,甚至会退化成链表,查询效率为O(n)。
在1.8中,HashMap使用的是“红黑树”来解决哈希冲突。当桶中的链表长度超过阈值(8)时,链表会转化为红黑树,这样可以保证查询的时间复杂度为O(logn)。同时,在1.8中,当哈希冲突较多时,会自动扩容,以保证哈希表的负载因子不会超过0.75,从而保证查询效率。
此外,在1.8中,HashMap在实现上使用了CAS(Compare and Swap)操作,以保证线程安全性。在多线程环境下,CAS可以保证同时只有一个线程能够修改哈希表,从而避免了线程安全问题。
总之,1.8的HashMap相比于1.7的HashMap,在性能和安全性方面都有了较大的提升。
jdk1.7和1.8hashmap
在jdk1.7中,HashMap的底层实现是由数组和链表组成的。而在jdk1.8中,HashMap的底层实现是由数组、链表和红黑树组成的。 在节点方面,jdk1.8中的hash值设置为final修饰,因此计算出来的结果只可能是一个。 对于null的处理也有所不同,jdk1.8中的hash值一旦确定就不会再重新计算,同时新增了一个TreeNode节点,用于在需要时将链表转换为红黑树。 总的来说,jdk1.8相比于jdk1.7在HashMap的实现上进行了优化和改进。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [HashMap JDK1.7和JDK1.8的区别](https://blog.csdn.net/qq_47350811/article/details/127327440)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
阅读全文