[toc]
Hashtable
继承与实现关系
- Hashtable继承了Dictionary类实现了Map、Cloneable、Serializable接口
数据结构
- 内部采用了数组和链表这两个数据结构
数据是否允许为null
- HashTable中的key和value都不允许为null
线程安全
HashTable的所有方法都是synchronized修饰
参数 | 意义 | 默认值 |
---|---|---|
table | 桶数组 | 默认大小为11 |
count | 当前hashtable中的元素数量 | - |
threshold | 扩容阈值 | 8 |
loadfactor | 负载因子 | 0.75 |
MAX_ARRAY_SIZE | 桶数组的最大长度 | Integer.MAX_VALUE - 8 |
modCount | failfast的计数值 | - |
1 |
|
get()方法
1 |
|
扩容方法
- 求出新的容量(旧容量2倍+1)
- 判断是否达到最大容量
- 根据新容量初始化一个新表
- 求出新的阈值
- 把旧表中的数据迁移到新表
1 |
|
向桶中插入新节点的方法addEntry,会被put()方法调用
1 | private void addEntry(int hash, K key, V value, int index) { |
put()方法
- 对value判空,hashtable不允许key、value为空
- 根据key的hashCode值找到对应的索引
- 如果存在相同的key则遍历链表把那个key对应的value换成新的value
- 判断表中键值对数量是否大于阈值 是,调用rehash()方法扩容
- 直接把键值对插到哈希槽(链表第一位)
1 |
|