当前位置: 首页 > article >正文

Hashtable和HashMap的区别

HashtableHashMap 是 Java 中两种常用的哈希表实现,虽然功能类似(都用于存储键值对),但在设计、性能、线程安全等方面有显著区别。以下是它们的核心区别:


1. 线程安全性

特性HashtableHashMap
线程安全(所有方法用 synchronized 修饰)(非同步,需手动保证线程安全)
适用场景多线程环境单线程环境,或需手动控制同步的场景

示例

// Hashtable 线程安全(但性能较低)
Hashtable<String, Integer> table = new Hashtable<>();
table.put("key1", 1); // 同步操作

// HashMap 非线程安全(需手动同步)
HashMap<String, Integer> map = new HashMap<>();
map.put("key2", 2); // 非同步操作

2. Null 值支持

特性HashtableHashMap
允许 null 键(抛 NullPointerException(允许一个 null 键)
允许 null 值(抛 NullPointerException(允许多个 null 值)

示例

// Hashtable 不允许 null
table.put(null, 1);  // 抛出 NullPointerException
table.put("key", null);  // 抛出 NullPointerException

// HashMap 允许 null
map.put(null, 1);    // 允许
map.put("key", null); // 允许

3. 性能对比

特性HashtableHashMap
性能较低(同步操作带来额外开销)较高(无同步开销)
扩容机制默认初始容量 11,扩容为 2n+1默认初始容量 16,扩容为 2n

4. 继承体系

HashtableHashMap
父类Dictionary(已过时)AbstractMap
实现接口MapMap

5. 迭代器

特性HashtableHashMap
遍历方式使用 Enumeration(旧接口)使用 Iterator(支持快速失败)
遍历性能较低较高(Iterator 更高效)

示例

// Hashtable 使用 Enumeration
Enumeration<String> keys = table.keys();
while (keys.hasMoreElements()) {
    String key = keys.nextElement();
}

// HashMap 使用 Iterator
Iterator<String> it = map.keySet().iterator();
while (it.hasNext()) {
    String key = it.next();
}

6. 哈希冲突解决

  • 共同点:均使用 链地址法(数组+链表/红黑树)。
  • 区别
    • HashMap(JDK 8+):当链表长度 ≥8 时,链表转为红黑树,提高查询效率。
    • Hashtable:始终使用链表,无红黑树优化。

总结:如何选择?

场景推荐选择理由
多线程环境ConcurrentHashMapHashtable 性能更高,分段锁优化
单线程环境HashMap无锁,性能最优
遗留代码兼容Hashtable仅需兼容旧系统时使用

现代开发建议

  • 优先使用 HashMap(单线程)或 ConcurrentHashMap(多线程)。
  • Hashtable 已逐渐被淘汰,仅需在兼容旧代码时使用。

http://www.kler.cn/a/586958.html

相关文章:

  • Java8计算集合属性的平均值
  • 隔板法的本质,球盒问题
  • Qt启动新窗口
  • Vue:Vue+TS学习笔记
  • 查看 tensorflow hub 模型文件信息
  • 深度学习大模型补充知识点
  • JAVA面试_进阶部分_dubbo负载均衡策略
  • 在1688平台上如何实现铺货和上传商品的自动化?
  • 浅谈AI落地之-加速训练
  • 模型蒸馏系列——开源项目
  • Mininet树形拓扑解析
  • 条件运算符
  • 洛谷 P1357 花园
  • c语言zixue
  • Java基础编程练习第31题-String类和StringBuffer类
  • 【八股文】ArrayList和LinkedList的区别
  • 【Python 语法】排序算法
  • 个人博客系统测试报告
  • C++程序设计语言笔记——抽象机制:模板
  • eclipse-mosquitt之docker部署安装与使用