Bohr-L Bohr-L
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

刘博

I'm a slow walker, But I never walk backwards.
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据处理与存储类

  • Spring 生态类

  • 缓存问题类

  • 多线程类

  • JVM 类

  • MySQL 类

  • Java 8 + 特性类

    • 使用 Java 8 的优点是什么?
    • 集合与流有何不同?
    • 什么是 Lambda 表达式?
    • 解释 Predicate 和 Consumer 函数式接口
    • peek () 方法在 Java 8 中的作用?
    • 什么是函数式接口?
    • 接口中的静态方法有什么作用?
    • skip (long) 和 limit (long) 的区别?
    • 抽象类和接口的异同?
    • overload 与 override 的区别?
    • HashMap 在 Java 8 中的变化?
      • HashMap、LinkedHashMap、Hashtable、ConcurrentHashMap 的区别?
      • Lambda 参数列表与箭头运算符的作用?
      • sleep () 和 wait () 的区别?
      • throw 与 throws 的区别?
      • final、finally、finalize 的区别?
      • Collection 与 Collections 的区别
      • ArrayList、LinkedList、Vector 的区别?
    • 其他技术类

    • 常见面试题
    • Java 8 + 特性类
    刘博
    2025-12-29
    目录

    HashMap 在 Java 8 中的变化?

    Java 8 对 HashMap 进行了重大优化,核心变化集中在 “数据结构、哈希冲突解决、性能提升”,具体如下:

    # 1. 数据结构优化:链表转红黑树

    • Java 7 及之前:HashMap 采用 “数组 + 链表” 结构,哈希冲突时元素追加到链表尾部,查询时间复杂度 O (n);
    • Java 8:当链表长度超过阈值(默认 8),且数组长度≥64 时,链表自动转为红黑树;当链表长度≤6 时,红黑树转回链表;
    • 优势:红黑树查询时间复杂度 O (log n),解决长链表查询效率低的问题(如哈希冲突严重时,查询速度提升显著)。

    # 2. 哈希函数优化

    • Java 7:哈希函数通过多次异或和右移计算(hashCode() → 高位异或 → 取模),逻辑复杂;
    • Java 8:简化哈希计算,直接用key.hashCode()异或其右移 16 位的值((h = key.hashCode()) ^ (h >>> 16)),减少计算开销,同时保留高位信息,降低哈希冲突概率。

    # 3. 扩容机制优化

    • 扩容时元素迁移:
      • Java 7:扩容时需重新计算每个元素的哈希值,再判断是否迁移到新数组(复杂);
      • Java 8:利用红黑树的有序性,迁移时无需重新计算哈希,直接按节点顺序拆分迁移,效率更高;
    • 扩容阈值:默认初始容量 16,负载因子 0.75,扩容阈值 = 容量 × 负载因子(如 16×0.75=12),与 Java 7 一致,但红黑树结构减少了扩容频率。

    # 4. 其他变化

    • 支持null键和null值的逻辑不变,但红黑树结构让null键的查询更高效;
    • 新增forEach方法(支持 Lambda 表达式),简化遍历(如map.forEach((k,v) -> System.out.println(k+":"+v)));
    • 新增compute、merge等方法,支持更灵活的键值对操作(如map.computeIfAbsent(key, k -> new ArrayList<>()))。

    # 核心优势

    • 查询性能提升:长链表转红黑树,解决极端场景下的查询瓶颈;
    • 计算开销降低:简化哈希函数,减少 CPU 消耗;
    • 遍历更便捷:支持 Lambda 表达式,适配函数式编程。

    #


    上次更新: 12/30/2025
    overload 与 override 的区别?
    HashMap、LinkedHashMap、Hashtable、ConcurrentHashMap 的区别?

    ← overload 与 override 的区别? HashMap、LinkedHashMap、Hashtable、ConcurrentHashMap 的区别?→

    最近更新
    01
    CPU 使用率较高排查和解决
    12-29
    02
    JVM OOM 问题如何排查和解决
    12-29
    03
    接口防刷怎么实现?
    12-29
    更多文章>
    Theme by Vdoing | Copyright © 2025-2026 Bohr-L's note
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式