Hash

HashMap:

  数组加链结构,jdk1.8 链表节点数>=8时,变成红黑树,小于6时,又变成链表。线程不安全的,允许key,value为null,但只要一个key可以为null。初始容量16,加载因子为0.75,扩容增量为1倍。按位与来求余数,比求模更快,所以容量是2的幂次方。

 

HashTable:

  父类是dictionary类,比HashMap多两个实现方法:elements,contains;线程安全,效率低,不允许key和value为null,初始容量11, 加载因子为0.75 , 扩容增量:2*原数组长度+1 。

 

concurrentHashMap:

  线程安全,效率比hashtable高,使用分段锁,并不对整个数据进行锁定。 <JDK1.7>, 使用 Segment数组 + HashEntry数组 + 链表 。 分段锁 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。
 <jdk1.8> 使用 Node数组+链表+ 红黑树 。
 使用的是优化的synchronized 关键字同步代码块 和 cas操作了维护并发。  简化结构,put和get不用二次哈希,一把锁只锁住一个链表或者一棵树,并发效率更加提升

Hash

上一篇:设计模式之享元模式


下一篇:String,StringBuilder,StringBuffer