jdk1.8 hashtable 学习
hashtale 【线程安全】
1、用一个数字实现 有一个hash桶 。Entry<K,V> 默认11个长度
2、HASH桶里使用了链式地址(链表)形式存放数据,来解决HASH冲突。
Entry{
final int hash;
final K key;
V value;
Entry<K,V> next;
}
3、基础字段
count hash桶的数量
threshold 重新HASH阈值
loadFactor 加载因子 0.75f
modCount :用于FAIL_FIST策略防止其他线程修改元素
4、操作
synchronized V put(key,value)
1、value 不能未空NullPointerException
2、计算落座与hash桶的位置
hash = key.hashcode()
index = (hash & 0x7FFFFFFF) % tab.length();
3、通过key.hashcode与 key equals 来查找是否已经存在,并返回原来数据,和将新数据写入。
4、新建:调用addEntry方法
4.1 重新HASH
4.1.1、如果count >= threshold 就需要重新HASH
hash 表 数值容积左移1位 及翻倍+1
int newCapacity = (oldCapacity << 1) + 1;
如果 newCapacity - MAX_ARRAY_SIZE > 0 :newCapacity = MAX_ARRAY_SIZE
modCount++
计算阈值:
threshold = (int)Math.min(newCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
旧HASH桶数据写入新HASH桶数据
4.1.2、本次数据从小计算落座位置
4.2、写入数据 然后将原来位置的数据放到本数据之后,形成链表。
5、移除元素:调用remove(key)
5.1计算位置
hash = key.hashcode()
index = (hash & 0x7FFFFFFF) % tab.length();
5.2、循环寻找key.hashcode与 key equals
5.3、如果没有找打 将自己给到前面节点 将后续节点给到自己。
5.4、如果找到就将 自己后续节点给到向前节点的后续节点
修改前:
找到了
移除