1
、线程安全:
HashMap
是非线程安全的,
HashTable
是线程安全的;
HashTable
内部的方法基本都经过
synchronized
修 饰 。 如 果 要 保 证 线 程 安 全 的 话 就 建 议 使 用
ConcurrentHashMap
, 也 可 以 通 过
Collections.synchronizedMap(hashmap)
方式将
hashmap
转换为线程安全的
map
2
、效率:因为线程安全的问题,
HashMap
要比
HashTable
效率高一点。另外
HashTable
基本被淘汰,不要在
代码中使用它
3
、对
Null key
和
Null value
的支持:
HashMap
中
null
可以作为键,这样的键只有一个,可以有一个或多个键
所对应的值为
null
。但是在
HashTable
中
put
进的键值只要有一个
null
,直接抛
NullPointerException
。
4
、初始容量大小和每次扩充容量大小的不同 :
①
创建时如果不指定容量初始值,
Hashtable
默认的初始大小为
11
,之后每次扩充,容量变为原来的
2n+1
。
HashMap
默认的初始化大小为
16
。之后每次扩充,容量变为原来的
2
倍。
②
创建时如果给定了容量初始值,那么
Hashtable
会直接使用给定的大小,而
HashMap
会将其扩充为
2
的幂次方大小。也就是说
HashMap
总是使用
2
的幂作为哈希表的大小。
5
、底层数据结构:
JDK1.8
以后的
HashMap
在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认
8
)时,将链表转化为红黑树,以减少搜索时间。
Hashtable
没有这样的机制。
推荐使用:在
Hashtable
的类注释可以看到,
Hashtable
是保留类不建议使用,推荐在单线程环境下使用
HashMap
替代,如果需要多线程使用则用
ConcurrentHashMap
替代。