跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java Hashtable
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本文适用于Java 8及以上版本。部分特性在早期版本中可能不可用。}} = Java Hashtable = '''Java Hashtable'''是Java集合框架中一个古老的键值对存储实现,自JDK 1.0起存在。它实现了{{code|Map}}接口,使用哈希表数据结构存储数据,具有线程安全的特性(所有方法用{{code|synchronized}}修饰)。本章将详细解析其实现原理、使用场景及与现代替代品的对比。 == 核心特性 == * '''线程安全''':所有公共方法均为同步方法 * '''不允许{{code|null}}键/值''':尝试存入{{code|null}}会抛出{{code|NullPointerException}} * '''初始容量与负载因子''':默认初始容量11,负载因子0.75 * '''枚举遍历''':提供{{code|elements()}}和{{code|keys()}}方法返回枚举器 * '''继承体系''': <mermaid> classDiagram direction BT Hashtable --> Dictionary Hashtable --> Map Hashtable --> Cloneable Hashtable --> Serializable </mermaid> == 基础用法 == === 创建实例 === <syntaxhighlight lang="java"> // 基础构造 Hashtable<String, Integer> populations = new Hashtable<>(); // 指定初始容量 Hashtable<String, Double> prices = new Hashtable<>(20); // 指定初始容量和负载因子 Hashtable<Character, Boolean> flags = new Hashtable<>(10, 0.5f); </syntaxhighlight> === 基本操作示例 === <syntaxhighlight lang="java"> Hashtable<String, Integer> inventory = new Hashtable<>(); inventory.put("Laptop", 15); // 添加 inventory.put("Mouse", 42); int count = inventory.get("Laptop"); // 获取 inventory.remove("Mouse"); // 删除 boolean exists = inventory.containsKey("Keyboard"); // 检查 </syntaxhighlight> == 并发特性分析 == 由于所有方法都使用{{code|synchronized}}修饰,Hashtable可实现线程安全,但会带来性能开销。以下示例演示多线程环境下的安全操作: <syntaxhighlight lang="java"> class InventoryManager { private static Hashtable<String, Integer> stock = new Hashtable<>(); public static void updateStock(String item, int delta) { synchronized(stock) { stock.put(item, stock.getOrDefault(item, 0) + delta); } } } </syntaxhighlight> {{Warning|虽然Hashtable本身线程安全,但复合操作(如"检查再写入")仍需额外同步}} == 性能考量 == 哈希表性能受以下因素影响: <math>O(1)</math>平均时间复杂度(理想情况下),但可能退化为<math>O(n)</math>(所有键哈希冲突时) === 扩容机制 === 当元素数量超过阈值(容量×负载因子)时自动扩容: <math>\text{newCapacity} = (\text{oldCapacity} << 1) + 1</math> == 与现代集合对比 == {| class="wikitable" |- ! 特性 !! Hashtable !! HashMap !! ConcurrentHashMap |- | 线程安全 | 是 | 否 | 是 |- | Null支持 | 否 | 是 | 否 |- | 迭代器 | 强一致性 | 快速失败 | 弱一致性 |- | 锁粒度 | 表级锁 | 无锁 | 分段锁/桶锁 |} == 实际应用案例 == === 配置文件解析 === <syntaxhighlight lang="java"> Hashtable<String, String> parseConfig(InputStream in) throws IOException { Properties props = new Properties(); props.load(in); // Properties继承Hashtable return new Hashtable<>(props); } </syntaxhighlight> === 数据缓存实现 === <syntaxhighlight lang="java"> class SimpleCache<K,V> { private final Hashtable<K,V> cache = new Hashtable<>(); private final int maxSize; public synchronized void put(K key, V value) { if(cache.size() >= maxSize) { cache.clear(); } cache.put(key, value); } } </syntaxhighlight> == 高级技巧 == === 自定义哈希函数 === 重写键对象的{{code|hashCode()}}和{{code|equals()}}方法: <syntaxhighlight lang="java"> class Product { String id; String category; @Override public int hashCode() { return Objects.hash(id, category); } @Override public boolean equals(Object o) { // 实现细节省略 } } </syntaxhighlight> === 同步视图创建 === <syntaxhighlight highlight lang="java"> Map<String, Integer> syncMap = Collections.synchronizedMap(new HashMap<>()); // 与Hashtable类似但允许null值 </syntaxhighlight> == 常见问题 == {{Q&A |question = 何时应该选择Hashtable而非ConcurrentHashMap? |answer = 仅在需要与遗留代码兼容,或确需强一致性的枚举遍历时考虑使用。大多数场景下ConcurrentHashMap性能更优。 }} {{Q&A |question = 为什么Hashtable不允许null值? |answer = 设计时认为null键/值容易导致歧义。get()方法返回null可能表示键不存在或键对应的值就是null。 }} == 最佳实践 == * 新代码优先考虑{{code|ConcurrentHashMap}} * 需要序列化时实现{{code|readObject}}/{{code|writeObject}}方法控制过程 * 遍历大型Hashtable时使用{{code|entrySet()}}而非{{code|keySet()}}提高效率 * 预估数据量时设置合理的初始容量避免频繁rehash == 参考代码 == 完整线程安全示例: <syntaxhighlight lang="java"> class TransactionManager { private final Hashtable<Long, Transaction> activeTransactions = new Hashtable<>(1000); public void beginTransaction(Long txId, Transaction tx) { activeTransactions.put(txId, tx); } public void commit(Long txId) { Transaction tx = activeTransactions.remove(txId); if(tx != null) { tx.commit(); } } public synchronized Collection<Transaction> getPendingTransactions() { return new ArrayList<>(activeTransactions.values()); } } </syntaxhighlight> {{BottomNote|在Java 21+中,考虑使用{{code|SequencedMap}}接口的新实现获得更丰富的功能}} [[Category:编程语言]] [[Category:Java]] [[Category:Java集合框架]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:BottomNote
(
编辑
)
模板:Code
(
编辑
)
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Q&A
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)