【大白话说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基础篇

相关推荐
Terra.K5 小时前
ThreadLocal解决一个线程里面跨层传递问题
java·开发语言·后端
泡海椒6 小时前
低代码规则开发:JQuick-Java声明式配置驱动开发落地教程
java·低代码·rxjava
变与不变8066 小时前
引用类型、内存原理与对象
开发语言·前端·javascript
wuyk5556 小时前
从零吃透 MQTT 通信|第 5 章 MQTT 心跳保活机制深度优化,断线检测与智能自动重连
c语言·开发语言·stm32·学习
weixin_440730506 小时前
socket解决多次输入问题-大数据接收问题-模块动态导入
java·开发语言·servlet
用户3126874877206 小时前
ReentrantLock 和 synchronized 到底选哪个?源码级对比与选型
java
计算机毕设定制辅导-无忧学长6 小时前
基于Spring Boot的玄幻小说个性化推荐平台设计与实现
java·vue.js·spring boot·后端·mysql·推荐算法
码路漫漫6 小时前
LRU 真的能解决日志按业务 Key 分文件的落地瓶颈吗?
java·后端
黄敬峰6 小时前
一文搞懂结构化大模型输出:从 SSE 到 Tool Calling 的四种姿势
面试
带刺的坐椅6 小时前
不只是 Token 流:Solon AI 4.1 的语义化聊天事件
java·stream·event·solon-ai