1.简介
- 存放的元素是键值对: 即 K- V
- 结构为数组+链表 不会转换成红黑树
- hashtable的键和值都不能为null
- hashTable 使用方法基本上和HashMap一样
- hashTable是线程安全的,hashMap是线程不安全的的
2.扩容机制
1.底层有数组 Hashtable$Entry[] 初始化大小为 11
2.临界值 threshold 8 = 11 * 0.75
3.扩容: 按照自己的扩容机制来进行即可
4.执行方法 addEntry(hash, key, value, index);添加 K-V 封装到Entry
5.满足if (count >= threshold) 时,就进行扩容
6.int newCapacity = (oldCapacity << 1) + 1; //两倍加一的大小扩容
底层解读:
1.
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
5.满足if (count >= threshold) { 扩容机制
int newCapacity = (oldCapacity << 1) + 1; //两倍加一
3.HashMap 与 HashTable区别
HashMap | HashTable | |
线程安全
|
非线程安全的
|
线程安全的(经过
synchronized
修饰)
|
效率
| 高 | 较低 |
对
Null key
和
Null value
的支持
|
null
可以作为
键
,这样的键只有
一个
,可以有一个或
多个
键所对应的
值
为
null
| 剑和值都不能为null |
初始容量大小和每次扩充容量大小的不同
|
默认的初始化大小为
16
之后每次扩充,容量变为原来的
2
倍。
|
默认的初始大小为
11
,之后每次扩充,容量变为原来
的
2n+1
。
|
底层数据结构
|
阈值(边界值)> 8 并且数组长度大于 64,才将链表转换为红黑树
| 数组+链表 |
推荐使用
|
不建议使用
|
推荐在单线程环境下使用
HashMap
替代
如果需要多线程使用则用
ConcurrentHashMap
替代。
|