【大白话说Java面试题】【Java基础篇】第21题:HashMap和Hashtable的区别是什么

第21题:HashMap和Hashtable的区别是什么

📚 回答:

  • 相同点

    1. 数据结构

      • JDK 1.7 及之前,HashMap和Hashtable的底层数据结构均为数组+链表
      • 但在JDK 1.8 中,HashMap引入了红黑树 优化(链表长度≥8时转换),而Hashtable仍保持数组+链表结构。
    2. 负载因子

      • 两者默认的负载因子都是0.75,用于控制扩容的触发条件。
  • 不同点

    1. 线程安全性

    • HashMap线程不安全的,适合单线程场景。
    • Hashtable线程安全 的,底层方法基本都用synchronized关键字修饰,适合多线程场景。

    2. 对null的支持

    • HashMap允许允许 key 为 null(仅一个),允许 value 为 null。

    • Hashtable不允许keyvaluenull

      • 如果keynull,会抛出NullPointerException异常。
      • 如果valuenull,也会抛出NullPointerException异常。

      3. 初始容量与扩容机制

    • 初始容量

      • HashMap的初始容量为16。
      • Hashtable的初始容量为11。
    • 扩容规则

      • HashMap:当已用容量 > 总容量 × 负载因子时,扩容为当前容量的2倍(2n)。
      • Hashtable:当已用容量 > 总容量 × 负载因子时,扩容为当前容量的2倍加1(2n + 1)。
    • 指定初始容量

      • HashMap:扩容后容量始终是2的幂次方。
      • Hashtable:直接使用用户指定的容量大小。

💡 面试官视角

  • 面试官可能会问"为什么HashMap允许null键值而Hashtable不允许?"

    答:Hashtable禁止null键值对,主要因为其底层实现直接依赖key.hashCode()value的操作,null会直接抛NullPointerException(早期设计未做兼容处理);同时禁止null可避免get(key)返回null时的歧义(无法区分key不存在还是value为null)。

    HashMap允许null键(通过hash(null)=0特殊处理)和null值,因其设计时考虑了更灵活的场景需求,但需开发者自行通过containsKey()判断键是否存在。

  • 面试官可能会追问"如果需要线程安全的HashMap怎么办?"

    答:可以使用Collections.synchronizedMap包装HashMap,或者直接使用ConcurrentHashMap


📌 专栏 :大白话说Java面试题 --- 01-Java基础篇

相关推荐
Fluxart.ai18 小时前
电商商品图审核怎么自动化?规则引擎、人工复核与发布门禁
java·前端·自动化
x_x-F19 小时前
网络数据从网卡到用户态:一场基于内存所有权转移的接力赛
开发语言·网络·php
名字还没想好☜19 小时前
Java 线上内存泄漏排查实战:jmap 导堆、MAT 找 GC Roots 与四类常见泄漏
java·开发语言·jvm·内存泄漏
码匠许师傅19 小时前
【C++ 面试真题】聊聊 C++ 的多继承与虚继承
开发语言·c++·面试
kyriewen19 小时前
面试官说"打开你的AI工具"——我才发现,他考的根本不是写代码
前端·人工智能·面试
我不是疯子是傻子20 小时前
Qt CAN通信周期发送抖动?实测定时器精度校准与时间戳补偿方案
开发语言·数据库·qt
IT爱学堂20 小时前
尚硅谷 - 2025年3月Java+AI大模型应用开发
java·开发语言·人工智能
有点。20 小时前
C++认识数
开发语言·c++
小贤plus21 小时前
SpringBoot 三大核心注解精讲:@ControllerAdvice、@RestControllerAdvice、@Validated 分组校验(实战)
java
吠品1 天前
Java byte数组与String互转:编码细节与踩坑记录
java·linux·服务器