目录

Hashtable

TreeMap

LinkedHashMap

ConcurrentHashMap


Hashtable

Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null

TreeMap

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

需要根据key对节点进行排序

JAVA系列:Hashtable、TreeMap 、LinkedHashMap、ConcurrentHashMap

排序方式 >> HashMap按key或value排序

TreeSet集合排序有两种方式,Comparable和Comparator区别:

  1:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法。

  2:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数。 第二种方式较为灵活。

JAVA系列:Hashtable、TreeMap 、LinkedHashMap、ConcurrentHashMap

 

 

LinkedHashMap

LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致(注意和TreeMap对所有的key-value进行排序进行区分)

JAVA系列:Hashtable、TreeMap 、LinkedHashMap、ConcurrentHashMap

 

JAVA系列:Hashtable、TreeMap 、LinkedHashMap、ConcurrentHashMap

HashMap实现

JAVA系列:Hashtable、TreeMap 、LinkedHashMap、ConcurrentHashMap

LinkedHashMap实现(hashmap调用的实际是LinkedHashMap的方法):

JAVA系列:Hashtable、TreeMap 、LinkedHashMap、ConcurrentHashMap

JAVA系列:Hashtable、TreeMap 、LinkedHashMap、ConcurrentHashMap

JAVA系列:Hashtable、TreeMap 、LinkedHashMap、ConcurrentHashMap

ConcurrentHashMap

在JDK1.7的实现上,ConrruentHashMap由一个个Segment组成,简单来说,ConcurrentHashMap是一个 Segment 数组,它通过继承ReentrantLock 来进行加锁,通过每次锁住一个segment来保证每个 segment 内的操作的线程安全性从而实现全局线程安全。 只有在求size等操作时才需要锁定整个表.

 

整个结构图如下

 

JAVA系列:Hashtable、TreeMap 、LinkedHashMap、ConcurrentHashMap

1.8 版本,它做了两个改进

1. 取消了 segment 分段设计,直接使用 Node 数组来保存数据,并且采用 Node 数组元素作

为锁来实现每一行数据进行加锁来进一步减少并发冲突的概率

2. 将原本数组+单向链表的数据结构变更为了数组+单向链表+红黑树的结构

 

为什么ConcurrentHashMap key、value都不能null?

使用的时候,如果不判断,将会抛异常!

JAVA系列:Hashtable、TreeMap 、LinkedHashMap、ConcurrentHashMap

理解如下:ConcurrentHashmap和Hashtable都是支持并发的,这样会有一个问题,当你通过get(k)获取对应的value时,如果获取到的是null时,你无法判断,它是put(k,v)的时候value为null,还是这个key从来没有做过映射。HashMap是非并发的,可以通过contains(key)来做这个判断。而支持并发的Map在调用m.contains(key)和m.get(key),m可能已经不同了。

 

 

put:首次CAS,后续节点synchronized 

 JAVA系列:Hashtable、TreeMap 、LinkedHashMap、ConcurrentHashMap

相关文章: