HashMap
和 Hashtable
都是在Java集合框架中用于存储键值对的类,但它们之间存在一些主要的区别:
-
同步性:
Hashtable
是线程安全的,它的方法是同步的,可以直接用于多线程环境。HashMap
不是线程安全的,它的方法不是同步的,如果需要在多线程环境中使用,必须自己添加同步机制(如使用Collections.synchronizedMap
将HashMap
转换为同步的)或者使用ConcurrentHashMap
。
-
性能:
- 由于
Hashtable
的同步性,它在多线程环境中比HashMap
更慢,因为同一时间只能有一个线程访问Hashtable
。 HashMap
由于非同步,通常提供更好的性能。
- 由于
-
空值:
HashMap
允许存储一个null键和多个null值。Hashtable
不允许键或值为null,尝试存储null键或值会抛出NullPointerException
。
-
遍历方式:
Hashtable
是遗留类,最初出现在JDK 1.0中,它支持自己的遍历方式,如Enumeration
。HashMap
是Java 1.2引入的集合框架的一部分,支持Iterator
遍历方式,这是集合框架引入的标准遍历接口。
-
继承的根类:
Hashtable
继承自Dictionary
类。HashMap
继承自AbstractMap
类并实现了Map
接口。
-
散列值的处理:
HashMap
引入了较为复杂的方式来处理哈希冲突,提高了效率,如链表和红黑树的结构。Hashtable
在处理哈希冲突方面相对简单,主要依赖于开放地址法或链地址法。
总结:尽管Hashtable
和HashMap
都用于存储键值对,但HashMap
是更现代的实现,它提供了更高的性能和更灵活的功能。在单线程应用程序中或需要存储null值时,通常推荐使用HashMap
。如果在多线程环境中需要线程安全的映射且不想手动同步,则可能需要考虑ConcurrentHashMap
而不是Hashtable
,因为它提供了更好的并发性能。
1、 HashMap和Hashtable是Map接口下的两个实现类,因为Map对象是键值对的,所以此两类也是键值对的。
2、 HashMap是线程非安全的,Hashtable是线程安全的,所以HashMap的效率高于Hashtable。
3、 HashMap允许键或值为null,键最多只可以有一个为null,值不受限制。而Hashtable键或值都不许为null。
注意:Hashtable中的“t”是小写的。