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、LinkedHashMap、Hashtable、ConcurrentHashMap 的区别?

    这四个均是 Java 中的 Map 实现类,核心差异在于 “线程安全、有序性、性能、功能特性”,具体对比如下:

    对比维度 HashMap LinkedHashMap Hashtable ConcurrentHashMap
    线程安全 非线程安全 非线程安全 线程安全(全表锁) 线程安全(Java 7:分段锁;Java 8:CAS+synchronized)
    有序性 无序(存储顺序≠插入顺序) 有序(维护双向链表,存储顺序 = 插入顺序) 无序 无序(Java 8 后支持.keySet () 有序遍历)
    空键 / 空值支持 支持 1 个 null 键,多个 null 值 支持 1 个 null 键,多个 null 值 不支持 null 键和 null 值 不支持 null 键和 null 值
    数据结构 Java 8:数组 + 链表 / 红黑树 数组 + 链表 / 红黑树 + 双向链表(维护顺序) 数组 + 链表 Java 8:数组 + 链表 / 红黑树
    性能(单线程) 最高(无锁,查询效率高) 略低于 HashMap(维护双向链表开销) 最低(全表锁,并发阻塞) 低于 HashMap,高于 Hashtable
    性能(多线程) 不支持(并发修改可能抛出 ConcurrentModificationException) 不支持 支持但低效(锁粒度大) 支持且高效(锁粒度小,支持高并发)
    核心用途 单线程场景,无需有序 单线程场景,需维护插入 / 访问顺序 Legacy 代码(不推荐新使用) 多线程高并发场景(如电商订单、缓存)

    # 关键特性详解

    • HashMap:最常用的 Map,单线程下性能最优,适合无需有序、非并发场景;
    • LinkedHashMap:继承自 HashMap,通过双向链表维护顺序,适合需 “插入顺序” 或 “访问顺序” 的场景(如 LRU 缓存);
    • Hashtable:古老的线程安全 Map,采用全表锁(修改时锁定整个表),并发性能差,且不支持 null 键值,现在已被 ConcurrentHashMap 替代;
    • ConcurrentHashMap:专为高并发设计,Java 8 用 CAS+synchronized 替代分段锁,锁粒度细化到节点,支持高并发读写,同时避免了 HashMap 的线程安全问题。

    #


    上次更新: 12/30/2025
    HashMap 在 Java 8 中的变化?
    Lambda 参数列表与箭头运算符的作用?

    ← HashMap 在 Java 8 中的变化? Lambda 参数列表与箭头运算符的作用?→

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