DESKTOP-7J91214_20200911-张军强
1.问题
HashMap 和 Hashtable 的区别
相同
- 两者都实现 Map 接口,用于存放
键-值对
- 内部都采用 哈希表 实现,都采用 哈希算法计算
键-值对
的存放位置 - 键(key)不能重复,键唯一,而值(value)可以重复
区别
-
扩容方式不同
- Hashtable:当 Entry 个数大于 阈值(threshold) 时就扩容,创建Hashtable实例时就创建其内部的数组
- 扩容方式: newCapacity = ( oldCapacity << 1 ) + 1
- HashMap :当 Entry 个数大于等于 阈值(threshold) 时就扩容,创建HashMap实例时并未创建内部的数组,是首次调用put方法时才会创建内部数组
- 扩容方式: newCapacity = oldCapacity << 1
- Hashtable:当 Entry 个数大于 阈值(threshold) 时就扩容,创建Hashtable实例时就创建其内部的数组
-
是否支持线程安全
- HashMap 非线程安全,理论上效率较高
- Hashtable 线程安全,理论上效率较低
-
内部实现不同
- 从 JDK 1.8 ( Java 8 ) 开始,HashMap 内部采用 数组 + 链表 + 红黑树 方式存储
- 当链表长度大于8时会自动转换成红黑树
- 当链表长度小于6时,红黑树重新转换成链表
- 而 Hashtable 内部则采用 数组 + 链表 实现
-
对元素位置的计算方法不同
- HashMap内部专门定义了一个类方法(hash)用于根据key.hashCode()返回一个新的数值
随后再通过该数值结合数组长度计算Entry的存放位置
- Hashtable 内部直接采用 key.hashCode() 来确定元素存放位置
int hash = key.hashCode() ; int index = ( hash & 0x7FFFFFFF ) % tab.length ;
-
两者所继承的类不同
- HashMap 类继承 java.util.AbstractMap
类 - Hashtable 类继承 java.util.Dictionary
类
- HashMap 类继承 java.util.AbstractMap
-
是否支持 null
-
HashMap 键 和 值都可以为null
-
Hashtable 键 和 值都不可以为null
-
2.吐槽
有时候莫名有点烦,艾希。
近期评论