1. 继承父类
HashMap 继承 AbstractMap;Hashtable继承Dictionary类,Dictionary类已过时,子类不建议使用,一般认为Hashtable是一个遗留类
2. 线程安全性
HashMap线程不安全,Hashtable线程安全
3. 包含的contains方法
contains方法通常用于获取一些数据中是否包含指定的数据。
HashMap中将contains拆分为 containsValue 和 containsKey ,分别可以获取key和value是否包含指定内容
Hashtable保留了contains方法,效果同containsValue
4. 是否允许null
HashMap的key和value都允许,Hashtable都不允许
5. 计算Hash值方法
HashMap计算key的hash值使用的是HashMap中的hash()方法,避免了过多的hash冲突
Hashtable用的是key的hashcode()方法获取hash值
6. 扩容方式不同
HashMap扩容为原来的2倍,Hashtable扩容为原来的2倍+1
HashMap初始容量16,大小必须2的指数倍;Hashtable默认11,大小可以自由定义
7. 底层实现不同
HashMap采用 数组 + 链表 + 红黑树(Java8之后);Hashtable采用 数组 + 链表