- 1.线程是否安全
HashMap非线程安全,Hashtable线程安全。
- 2.效率
HashMap非线程安全,比Hashtable效率高。
- 3.对null key和null value的支持
HashMap中null可以作为键,但只能有一个,null键对应的null值可以有多个。
Hashtable中null key 和 null value只能有一个,否则抛出 NullPointerException
- 4.初始容量大小和每次扩容大小的不同
①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。
②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大(HashMap 中的 tableSizeFor() 方法保证)。也就是说 HashMap 总是使用2的幂作为哈希表的大小,后面会介绍到为什么是2的幂次方。
- 5.底层数据结构
JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制