ConcurrentHashMap、HashTable、TreeMap、LinkedHashMap

ConcurrentHashMap

Segment段
ConcurrentHashMap和HashMap思路是差不多的,但是应为他支持并发操作所以复杂一些,整个ConcurrentHashMap是有一个个Segment组成 segment代表部分或一段的意思,所以很多地方都会将其描述为分段锁!每个Segment下的是可以扩容的

线程安全(Segment继承ReentrantLock)
简单理解就是ConcurrentHashMap是一个Segment数组,Segment通过继承ReenTrantLock来进行加锁,所以每次需要加锁的操作锁住是一个segment这样只要保证每个Segment是线程安全的,也就实现了全局线程安全

并行度(默认16)
concurrencyLevel :并行级别(并发数、Segment数 )默认是16,也就是说 ConcurrentHashMap 有 16 个 Segment,理论上这个时候最多同时支持16个线程并发,只要他们的操作分别分布在不用的Segment上。这个值可以在初始化的时候设置为其他值,但是一旦初始化以后,他是不可以扩容的。再具体到每个Segment内部,其实每个Segment很像之前介绍的HashMap,不过它要保证线程安全,处理起来麻烦些

Java8实现
也是引入了红黑树

HashTable

HashTable是遗留类,很多映射的常用功能与HashMap类似,不同的是它继承Dictionary,并且是线程安全的,任一时间只能有一个线程写入Hashtable,并发不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁,HashTable不建议在新代码中使用,不需要线程安全的场合可以用HashMap替换,需要线程安全的场合可以用ConcurrentHashMap替换

TreeMap(可排序的Map)

TreeMap实现了SortedMap接口,能够把他保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排序过的。
如果使用排序的映射建议使用TreeMap。
使用TreeMap时,key必须实现Comparable接口或者在构造TreeMap传入自定义的Comparable,否则会在运行时抛出java.lang.ClassCastException 类型的异常。

LinkedHashMap

LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历的时候,先得到的记录肯定是先插入的,也可以在构造是带参数,按照访问次序排序

总结
  • TreeMap:基于红黑树实现。
  • HashMap:基于哈希表实现。
  • HashTable:和HashMap类似,但是它是线程安全的,这意味着同一时刻可以同时写入HashTable并且不会导致数据不一致。它是遗留类,不应该去使用它可以用ConcurrentHashMap来支持线程安全
  • ConcurrentHashMap:支持线程安全,并且效率更高,引入了分段锁。
  • LinkedHashMap:使用双向链表来维护元素顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值