HashTable 和 HashMap 存在很多的相同点,但是他们还是有几个比较重要的不同点。
第一:我们从他们的定义就可以看出他们的不同,HashTable 基于 Dictionary 类,而 HashMap 是基于 AbstractMap。Dictionary 是什么?它是任何可将键映射到相应值的类的抽象父类,而 AbstractMap 是基于 Map 接口的骨干实现,它以最大限度地减少实现此接口所需的工作。
第二:HashMap 可以允许存在一个为 null 的 key 和任意个为 null 的 value,但是 HashTable 中的 key 和 value 都不允许为 null。如下:
当 HashMap 遇到为 null 的 key 时,它会调用 putForNullKey 方法来进行处理。对于 value 没有进行任何处理,只要是对象都可以。
if (key == null)
return putForNullKey(value);
而当 HashTable 遇到 null 时,他会直接抛出 NullPointerException异常信息。
if (value == null) {
throw new NullPointerException();
}
第三:Hashtable 的方法是同步的,而 HashMap 的方法不是。所以有人一般都建议如果是涉及到多线程同步时采用 HashTable,没有涉及就采用 HashMap,但是在 Collections 类中存在一个静态方法: synchronizedMap(),该方法创建了一个线程安全的 Map 对象,并把它作为一个封装的对象来返回,所以通过 Collections 类的 synchronizedMap 方法是可以我们你同步访问潜在的 HashMa