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)顺序。