三者出现的时间顺序是HashTable->HashMap->HashSet
查看HashSet的源代码,可以发现它是由HashMap备份然后进行所有操作,只不过HashSet里面的HashMap所有的value都是同一个Object。可以理解为简化版的 HashMap
| HashMap | HashSet |
|---|---|
| 实现了Map接口 | 实现了Set接口 |
| 存储键值对 | 存储对象 |
调用 put()向 Map 中添加元素 | 调用 add()方法向 Set 中添加元素 |
| 不允许重复键,但允许重复值。 | 不允许重复元素 |
| 允许单个空键和任意数量的空值 | 允许具有单个空值 |
使用键计算 hashcode | 使用成员对象来计算 hashcode ,对于两个对象 hashcode 可能相同,所以equals()方法用来判断对象的相等性 |
| HashMap | HashTable | |
|---|---|---|
| 线程安全性 | 非线程安全 | 线程安全 |
| 键值为空 | 支持 | 不支持 |
| 默认容量 | 16 | 11 |
| 扩容 | 容量翻倍 | 容量翻倍+1 |
| 效率 | 高 | 低 |