1. 继承不同
HashMap 是 Java1.2 引进的 Map 接口的实现;HashTable 是基于陈旧的 Dictionary 类。
2. 线程安全性不同
HashMap 是非同步、线程不安全的;HashTable 是同步、线程安全的,它的方法里添加 synchronized 关键字来确保线程同步,在多线程并发情况下,可以直接使用 HashTable。并发情况下如果要使用 HashMap 的话,需要自己增加同步处理,也就是加锁操作。
3. 是否提供 contains 方法
HashMap 只有 containsValue 和 containsKey 方法;HashTable 有 contains、containsValue 和 containsKey 三个方法,其中 contains 和 containsValue 方法功能相同。
4.key 和 value 是否允许 null 值
HashMap 中,null 可以作为键,但只能有一个键为 null,同时允许有一个或多个键对应的值为 null;当 get()方法返回 null 值时,则可以表示 HashMap 中没有该键,也可以表示该键所对应的值为 null,因此在 HashMap 中不能由 get()方法来判断 HashMap 中是否存在某个键,而应该用 containsKey()方法来判断。
而 HashTable 中 key 和 value 都不允许出现 null 值。
5. 数组初始化和扩容机制
HashTable 在不指定容量的情况下默认容量为 11,而 HashMap 为 16;HashTable 不要求底层数组的容量一定要为 2 的整数次幂,而 HashMap 则要求一定为 2 的整数次幂。
HashTable 扩容时,将容量变为原来的 2 倍加 1,而 HashMap 扩容时将容量变为原来的 2 倍。