Java集合简介之Map接口

Java集合简介之List接口
Java集合简介之Set接口

接下来我们一起介绍一下Map,它与我们的生活息息相关。

Map没有继承Collection接口,Map提供key、value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。
Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。

在这里插入图片描述

HashMap

HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。HashMap是一个线程不安全的类,HashMap 底层是基于 数组 + 链表 组成的。

Hashtable

Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。
HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占,相当于所有线程进行读写时都去竞争一把锁,导致效率非常低下

WeakHashMap

WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

TreeMap

TreeMap是一个有序的key-value集合,它是通过红黑树实现的。

ConcurrentHashMap

和 HashMap 非常类似,唯一的区别就是其中的核心数据如 value ,以及链表都是 Volatile 修饰的,保证了获取时的可见性。
多线程环境下,使用HashMap进行put操作时存在丢失数据的情况,为了避免这种bug的隐患,建议使用ConcurrentHashMap代替HashMap。
原理上来说:ConcurrentHashMap 采用了分段锁技术,其中 Segment 继承于 ReentrantLock。不会像 HashTable 那样不管是 put 还是 get 操作都需要做同步处理,理论上 ConcurrentHashMap 支持 CurrencyLevel (Segment 数组数量)的线程并发。每当一个线程占用锁访问一个 Segment 时,不会影响到其他的 Segment。

HashMap和Hashtable区别:

Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步。效率较低,不允许null这null键。

HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题,效率较高。使用HashMap时就必须要自己增加同步处理。允许null值和null键。

HashMap不是线程安全的,但是它的效率会比Hashtable要好很多。这样设计是合理的。在我们的日常使用当中,大部分时间是单线程操作的。HashMap把这部分操作解放出来了。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。

参考Java并发编程笔记之ConcurrentHashMap原理探究
参考一文让你彻底理解 Java HashMap 和 ConcurrentHashMap
参考HashMap 与HashTable的区别

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值