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

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

java map是继承 map继承了什么接口_数据

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使用了分段锁,并不对整个数据进行锁定。