HashMap和Hashtable的区别
比较HashMap和Hashtable
1) Hashtable
是线程安全的(即定义在Hashtable
中的方法),但HashMap
不是。如果你想使一个HashMap
是线程安全的,可以使用 Collections.synchronizedMap(map) 或者ConcurrentHashMap
类。
Hashtabe
中的同步方法是如下定义的
1 public synchronized boolean contains(Object obj){ ... } 2 public synchronized boolean containsKey(Object obj){ ... } 3 public synchronized Object get(Object obj){ ... } 4 public synchronized Object put(Object obj, Object obj1){ ... } 5 public synchronized Object remove(Object obj){ ... }
2) Hashtable
不允许空(null)的键或值。HashMap
允许一个空键(其他的空键会覆盖第一个空键)和任意数量的空值。
1 Hashtable<String, String> hashTable = new Hashtable<String, String>(); 2 hashTable.put(null, "value"); 3 //OR 4 hashTable.put("key", null); 5 6 Output: 7 8 Exception in thread "main" java.lang.NullPointerException 9 at java.util.Hashtable.hash(Unknown Source) 10 at java.util.Hashtable.put(Unknown Source) 11 at test.core.MapExamples.main(MapExamples.java:12)
3) Hashtable
从Java语言问世的以来就已经存在,而HashMap
是在Java集合框架诞生作为其一部分新出现的(JDK 1.2)。还要注意正如Java docs所声明的Hashtable
继承Dictionary
类,而在新的JDK版本中增加了实现Map
接口
1 //HashTable is defined as 2 public class Hashtable extends Dictionary implements Map, Cloneable, Serializable {} 3 //HashMap is defined as 4 public class HashMap extends AbstractMap implements Map, Cloneable, Serializable {}
4) HashMap
的迭代器(Iterator
)是快速失败(fail-fast)的,如果其他线程不用迭代器本身的remove()方法,而通过别的add或remove任何元素,从而修改了Map
的中的数据,那么会抛出ConcurrentModificationException
,JVM会尽力,但这并不是一个有保证的行为。Hashtable
的枚举器(Enumerator
)不是快速失败的(fail-fast)。
1 HashMap<String, String> hashMap = new HashMap<String, String>(); 2 hashMap.put("key1", "value1"); 3 hashMap.put("key2", "value2"); 4 hashMap.put("key3", "value3"); 5 hashMap.put("key4", "value4"); 6 7 Iterator<String> iterator = hashMap.keySet().iterator(); 8 while(iterator.hasNext()){ 9 iterator.next(); 10 iterator.remove(); 11 System.out.println(hashMap); 12 } 13 14 Output: 15 16 {key3=value3, key2=value2, key1=value1} 17 {key2=value2, key1=value1} 18 {key1=value1} 19 {}
5) 最后,Map
接口修正了一个Hashtable
的小缺陷。Hashtable
有一个方法contains(),但方法名并不明确到底包含键,还是包含值,在Map接口中被删掉,只留下了containsValue() 和containsKey()。
public boolean containsKey(Object obj) {...} public boolean containsValue(Object obj) {...}
对于HashMap和Hashtable使用建议
几乎没有任何工作是只能Hashtable
做,而HashMap
及其相关的类(如LinkedHashMap
或者ConcurrentHashMap
)不能完成的。所以,您编写的代码没有很好的理由使用Hashtable
。总是优先实用HashMap
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY