【大白话说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不允许key或value为null:

      • 如果key为null,会抛出NullPointerException异常。
      • 如果value为null,也会抛出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基础篇

相关推荐
独泪了无痕8 小时前
探索Pinyin4j-Java中的拼音转换利器
java·后端
道尔柯南9 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
岁月宁静10 小时前
AI 应用开发工程师简历怎么写:HR 初筛、技术复筛、面试追问,三道关卡各看什么?
人工智能·python·面试
来让爷抱一个10 小时前
Python 异步里混用同步库,事件循环被卡住的全过程
开发语言·python
kingx310 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm
Dream it possible!12 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
DevOpenClub12 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
心祭丫丫13 小时前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
露天赏雪14 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
天天被压力14 小时前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python