你真的懂HashTable吗?

1.聊一下HashTable
和跟HashMap相⽐HashTable是线程安全的,适合在多线程的情况下使⽤,但是效率低。
HashTable在数据操作的时候会上锁,所以效率低。
在这里插入图片描述
2.HashMap和HashTable的区别
1.Hashtable 是不允许键或值为 null 的,HashMap 的键值则都可以为 null。
因为Hashtable在我们put 空值的时候会直接抛空指针异常,但是HashMap却做了特殊处理。
在这里插入图片描述Hashtable使⽤的是安全失败机制(fail-safe),这种机制会使你此次读到的数据不⼀定是最新的数据。
如果你使⽤null值,就会使得其⽆法判断对应的key是不存在还是为空,因为你⽆法再调⽤⼀次contain(key)来对key是否存在进⾏判断,ConcurrentHashMap同理。

2.实现⽅式不同:Hashtable 继承了 Dictionary类,⽽ HashMap 继承的是 AbstractMap 类。Dictionary 是 JDK 1.0 添加的。

3.初始化容量不同:HashMap 的初始容量为:16,Hashtable 初始容量为:11,两者的负载因⼦默认都是:0.75。

4.扩容机制不同:当现有容量⼤于总容量 * 负载因⼦时,HashMap 扩容规则为当前容量翻倍,Hashtable 扩容规则为当前容量翻倍 + 1。

5.迭代器不同:HashMap 中的 Iterator 迭代器是 fail-fast 的,⽽ Hashtable 的 Enumerator 不是 failfast 的。
所以,当其他线程改变了HashMap 的结构,如:增加、删除元素,将会抛出ConcurrentModificationException 异常,⽽ Hashtable 则不会。

2.什么是快速失败
快速失败(fail—fast)是java集合中的⼀种机制, 在⽤迭代器遍历⼀个集合对象时,如果遍历过程中对集合对象的内容进⾏了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。

原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使⽤⼀个 modCount 变量。集合在被遍历期间如果内容发⽣变化,就会改变modCount的值。
每当迭代器使⽤hashNext()/next()遍历下⼀个元素之前,都会检测modCount变量是否为
expectedmodCount值,是的话就返回遍历;否则抛出异常,终⽌遍历。

Tip:这⾥异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发⽣变化时修改modCount值刚好⼜设置为了expectedmodCount值,则异常不会抛出。
因此,不能依赖于这个异常是否抛出⽽进⾏并发操作的编程,这个异常只建议⽤于检测并发修改的bug。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戏子 丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值