一、概述:
1、Hashtable和Hashmap是我们在开发过程中经常用来映射key到value的容器。
2、Hashtable和Hashmap实现的功能基本相同,核心都是散列表的实现,因而查找、插入、删除效率高,时间复杂度平均能达到O(1)。
二、两者的不同之处:
1、它们的继承关系有所不同。
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
Hashtable是基于陈旧的Dictionary类的。HashMap是Map接口的一个实现,继承于较新的AbstractMap类。Hashmap可以算作是Hashtable的升级版本,整体上Hashmap对Hashtable类优化了代码。HashMap去掉了contains方法,保留了containsKey和containsValue方法。
2、值的作用域不同。
在HashMap中,null可以作为key,这样的key只有一个,可以有一个或多个key所对应的value为null。
而在Hashtable中,null不可以作为key,也不可以作为value。否则会抛出空指针异常。
ps:注意一个问题,因为HashMap可以存入null。所以当get()方法返回null值时,既可以表示HashMap中没有该key,也可以表示该key所对应的value为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个key, 而应该用containsKey()方法来判断。
3、同步与异步。
Hashtable的方法是同步的,即Hashtable线程安全。不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable。
HashMap的方法是异步的,即HashMap线程不安全。所以说:HashMap是Hashtable的轻量级实现(非线程安全的实现)
ps1:这两者的不同是通过在读写方法上加synchronized关键字来实现的。Hashtable的源代码中,在需要线程安全的方法前都加上了synchronized关键字。所以可以认为HashMap的效率要比table的效率略高一点。
ps2:当既要同步又要可以让null作为键或者值的时候,一个简便的方法就是利用Collections类的静态的synchronizedMap()方法,
Map synMap = Collections.synchronizedMap(map);
它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。