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、如果找到就将 自己后续节点给到向前节点的后续节点
修改前:
   

找到了

移除
   

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值