HashMap Java7 和 Java8 的不同, 及ConcurrentHashMap

197 阅读1分钟

Java7 中的Hashmap

Hashmap里是一个数组,数组中每个元素是个单向链表,里面包含一个个Entry。Entry包含四个属性:key,value,hash和next。
Java7中的Hashmap包含三个parameters:

  • capacity: 当前数组容量,始终保持2^n.可以扩容,每次扩容为原来的两倍大
  • loadFactor: 负载因子。默认为0.75
  • threshold: 扩容的阈值。等于capacity * loadFactor

Java8 中的Hashmap

不再只使用链表,而是引入了红黑树,是由数组+链表+红黑树组成。引入红黑树的原因是,链表的时间复杂度是O(n),而引入红黑树后,当链表中元素超过了8个,就会自动转换成红黑树,降低时间复杂度为O(logN)

ConcurrentHashMap

在Java8也引入了红黑树

Segment

和Hashmap类似,ConcurrentHashMap本质上是一个数组。但是由于ConcurrentHashMap支持并发操作,所以引入了Segment概念,即分段锁,这使得ConcurrentHashMap是线程安全的。Segment通过继承ReentrantLock来加锁,每次上锁都是锁住一个segment。

ConcurrencyLevel

即ConcurrentHashMap里的并行级别,总共有多少个segment。默认情况下,这个数值是16,即ConcurrentHashMap内有16个segments,同时支持16个线程进行并发编程。这个值可以在初始化时被设置,但是一旦初始化后就无法修改,也不能像Hashmap一样扩容。