HashMap与Hashtable

本文探讨了HashMap与Hashtable的异同,分析了它们在线程安全、同步机制及性能上的区别,并介绍了ConcurrentHashMap作为高并发场景下的更优选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相同之处

HashMap和Hashtable都实现了Map接口

不同之处

在于县线程安全性、同步(synchronization)以及速度
- HashMap是非synchronization的,并且key与value可以为null
- Hashtable是synchronization的,是线程安全的,Java5提供了ConcurrentHashMap,是Hashtable的替代,比HashTable拓展性更好
- HashMap的迭代器是fail-fast迭代器,而Hashtable的enumerator不是
- 单线程环境比HashMap慢
- hashtable的初始容量为11,增加时2n+1,hashmap为16,增加时2n

ConcurrentHashMap

  • ConcurrentHashMap本质上是一个Segment数组,而一个Segment实例又包含若干个桶,每个桶中都包含由若干个HashEntry对象连接起来的链表
    -HashMap重Hash,死循环
  • 一个ConcurrentHashMap实例中包含由若干个Segment实例组成的数组,而一个Segment实例又包含由若干个桶,每个桶中都包含一条由若干个 HashEntry 对象链接起来的链表
  • HashEntry用来封装具体的键值对,是个典型的四元组。与HashMap中的Entry类似,HashEntry也包括同样的四个域,分别是key、hash、value和next。不同的是,在HashEntry类中,key,hash和next域都被声明为final的,value域被volatile所修饰,因此HashEntry对象几乎是不可变的,这是ConcurrentHashmap读操作并不需要加锁的一个重要原因,由于value域被volatile修饰,所以其可以确保被读线程读到最新的值,这是ConcurrentHashmap读操作并不需要加锁的另一个重要原因
  • 通过使用段(Segment)将ConcurrentHashMap划分为不同的部分,ConcurrentHashMap就可以使用不同的锁来控制对哈希表的不同部分的修改,从而允许多个修改操作并发进行, 这正是ConcurrentHashMap锁分段技术的核心内涵。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值