首页 > 其他分享 >JDK7和JDK8中的HashMap有什么区别?

JDK7和JDK8中的HashMap有什么区别?

时间:2024-09-26 22:21:32浏览次数:3  
标签:顺序 HashMap JDK 数组 链表 JDK8 哈希 JDK7

        在JDK 7和JDK 8中,HashMap的实现有显著的不同,主要体现在以下几个方面:

1. 数据结构

  • JDK 7: 在JDK 7中,HashMap使用数组+链表的数据结构来存储键值对。当发生哈希冲突时,即多个键映射到同一个桶(bucket)时,这些键值对会以链表的形式存储。

  • JDK 8: 在JDK 8中,当链表的长度超过一定阈值(默认为8)时,链表会被转换成红黑树,这样可以减少搜索时间,提高性能。这种数据结构被称为“数组+链表+红黑树”。

2. 索引计算

  • JDK 7: 在JDK 7中,计算键的哈希值后,会使用哈希值与数组长度的模运算来确定索引位置。

  • JDK 8: 在JDK 8中,计算键的哈希值后,会使用哈希值的高位与低位进行异或运算,然后与数组长度的减一进行与运算,以确定索引位置。这种方法可以减少哈希碰撞的概率。

3. 扩容机制

  • JDK 7: 在JDK 7中,当HashMap的元素数量达到容量和负载因子乘积时,会进行扩容操作。扩容操作会创建一个新的更大的数组,并将所有元素重新哈希到新数组中。

  • JDK 8: 在JDK 8中,扩容操作与JDK 7类似,但是扩容过程中元素在新数组中的位置不仅取决于哈希值,还取决于元素在原数组中的位置是偶数还是奇数,这样可以减少重新哈希的次数。

4. 迭代顺序

  • JDK 7: 在JDK 7中,HashMap的迭代顺序是插入顺序的逆序。

  • JDK 8: 在JDK 8中,由于引入了红黑树,迭代顺序可能会更加复杂,因为树结构的遍历顺序与链表不同。

举例说明

        以下是一个简单的例子,展示了JDK 7和JDK 8中HashMap的不同行为:

import java.util.HashMap;
import java.util.Map;

public class HashMapExample {
    public static void main(String[] args) {
        // JDK 7 和 JDK 8 的 HashMap 示例
        Map<Integer, String> map = new HashMap<>();
        map.put(10, "A");
        map.put(20, "B");
        map.put(30, "C");

        // JDK 7 中,迭代顺序通常是插入顺序的逆序
        // JDK 8 中,由于链表转红黑树,迭代顺序可能更复杂
        for (Map.Entry<Integer, String> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

        在JDK 7中,输出顺序可能是30, 20, 10,而在JDK 8中,由于链表可能转换为红黑树,输出顺序可能不同。

总结

        JDK 8中的HashMap在性能上有所改进,尤其是在处理大量数据时,链表转红黑树的操作可以显著提高性能。此外,JDK 8中对索引计算和扩容机制进行了优化,以减少哈希碰撞和提高内存利用效率。

标签:顺序,HashMap,JDK,数组,链表,JDK8,哈希,JDK7
From: https://blog.csdn.net/2401_83418369/article/details/142579261

相关文章

  • HashMap和HashTable
    HashMaphashMap基于哈希表,底层结果由数组实现,添加到map里的元素以key-value的形式存储在数组中,在数组中key-value已一个实体的形式存储, 也就是继承至map接口中的entry,下图是map源码enrty既然hashMap是基于哈希表,就会出现一个问题,就是哈希值重复,专业术语叫哈......
  • Java集合类面试题:Map接口(链表、HashMap、红黑树)
    收集大量Java经典面试题目......
  • HashMap源码分析:如何实现一次put方法
    前情提示:&为按位与运算,将两个数转为二进制,当他们对应位置都为1的时候,得到的结果为,其他情况下结果为0例如:0000000000001011--->110000000000001001--->90000000000001001--->9即11&9=9 本篇主要介绍hashMap的构造方法、put方法相关内容相关成员变量介绍......
  • 深入理解ConcurrentHashMap
    HashMap为什么线程不安全put的不安全由于多线程对HashMap进行put操作,调用了HashMap的putVal(),具体原因:假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的;当线程A执行完第六行由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元素,完成了正......
  • 深入理解ConcurrentHashMap
    HashMap为什么线程不安全put的不安全由于多线程对HashMap进行put操作,调用了HashMap的putVal(),具体原因:假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的;当线程A执行完第六行由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元素,完成了正......
  • 一文搞定WeakHashMapE0
    写在前面在缓存场景下,由于内存是有限的,不能缓存所有对象,因此就需要一定的删除机制,淘汰掉一些对象。这个时候可能很快就想到了各种Cache数据过期策略,目前也有一些优秀的包提供了功能丰富的Cache,比如Google的GuavaCache,它支持数据定期过期、LRU、LFU等策略,但它仍然有可能会导致有......
  • 一文搞定WeakHashMap
    写在前面在缓存场景下,由于内存是有限的,不能缓存所有对象,因此就需要一定的删除机制,淘汰掉一些对象。这个时候可能很快就想到了各种Cache数据过期策略,目前也有一些优秀的包提供了功能丰富的Cache,比如Google的GuavaCache,它支持数据定期过期、LRU、LFU等策略,但它仍然有可能会导致有......
  • 【Java集合】HashMap
    哈希表        哈希表又叫散列表,或者映射、字典都是指哈希表,哈希表是通过关键码映射到数组的某个位置来访问的数据结构,实现这个映射的函数就是哈希函数,哈希表结合了数组和链表的优点,查找和插入操作的时间复杂度都是O(1)。        哈希表基于数组实现,哈希函数......
  • 【JDK8新特性】Stream API 结合Lambda语法在项目中的实战应用
    Lambda语法回顾在JDK8中,Lambda表达式支持的引用类型主要有以下几种,如表1所示。种类Lambda表达式示例对应的引用示例类名引用普通方法(x,y,...)->对象名x.类普通方法名(y,...)类名::类普通方法名类名引用静态方法(x,y,...)->类名.类静态方法名(x,y,...)......
  • HashSet&HashMap
    一.哈希......