Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析 今天发一篇”水文”,可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍.本来以为花不了多少时间的,不过最终还是投入了挺多时间来完成这篇文章的. 网上关于 HashMap 和 ConcurrentHashMap 的文章确实不少,不过缺斤少两的文章比较多,所以才想自己也写一篇,把细节说清楚说透,尤其像 Java8 中的 ConcurrentHashMap,大部分文章都说不清楚.终归是希望…
Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析 转自https://www.javadoop.com/post/hashmap#toc7 部分内容转自 http://www.jasongj.com/java/concurrenthashmap 今天发一篇"水文",可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍.本来以为花不了多少时间的,不过最终还是投入了挺多时间来完成这篇文章的. 网上关于 HashMap 和 Con…
阅读前提:本文分析的是源码,所以至少读者要熟悉它们的接口使用,同时,对于并发,读者至少要知道 CAS.ReentrantLock.UNSAFE 操作这几个基本的知识,文中不会对这些知识进行介绍.Java8 用到了红黑树,不过本文不会进行展开,感兴趣的读者请自行查找相关资料. Java7 HashMap HashMap 是最简单的,一来我们非常熟悉,二来就是它不支持并发操作,所以源码也非常简单. 首先,我们用下面这张图来介绍 HashMap 的结构. 这个仅仅是示意图,因为没有考虑到数组要扩容的情…
Java7 HashMap  数组+链表 Java7 ConcurrentHashMap   Segment数组+HashEntry数组链表+ReenTrantLock分段锁 Java8 HashMap  链表Node数组+红黑树TreeNode数组(链表大于8时转换) Java8 ConcurrentHashMap   链表Node数组+红黑树TreeNode数组+Synchronized同步锁 Java7 HashMap HashMap 是最简单的,一来我们非常熟悉,二来就是它不支持并发操作…
沉淀再出发:java中的HashMap.ConcurrentHashMap和Hashtable的认识 一.前言 很多知识在学习或者使用了之后总是会忘记的,但是如果把这些只是背后的原理理解了,并且记忆下来,这样我们就不会忘记了,常用的方法有对比记忆,将几个易混的概念放到一起进行比较,对我们的学习和生活有很大的帮助,比如hashmap和hashtab这两个概念的对比和记忆. 二.HashMap的基础知识 2.1.HashMap的介绍 HashMap 是一个散列表,它存储的内容是键值对(key-val…
JAVA7 Java7的ConcurrentHashMap里有多把锁,每一把锁用于其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率呢.这就是“锁分离”技术. ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成.Segment是一种可重入锁(继承了ReentrantLock),在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据. ConcurrentHa…
题外话:为什么要hashcode进行spread? 充分使用key.hashCode()的高16位信息,保证hash分布更分散, 扩容操作是新建2倍于原表大小的新表,并将原表结点拷贝一份放在新表中,对原表无修改或修改很小.当原表所有结点都已被拷贝到新表中后,原表会被垃圾回收. 在jdk7中的HashMap实现类中,数组+链表.扩容操作是将原数组的结点一一进行hash计算,然后一一挂接到新数组上,所以不是基于复制结点的机制.在jdk7中的ConcurrentHashMap实现类中,段(segmen…
HashMap Fast-Fail(遍历时写入操作异常) 在使用迭代器的过程中如果HashMap被修改,那么ConcurrentModificationException将被抛出,也即Fast-fail策略. 当HashMap的iterator()方法被调用时,会构造并返回一个新的EntryIterator对象,并将EntryIterator的expectedModCount设置为HashMap的modCount(该变量记录了HashMap被修改的次数). HashIterator() { ex…
HashMap 的数据结构 ​ hashMap 初始的数据结构如下图所示,内部维护一个数组,然后数组上维护一个单链表,有个形象的比喻就是想挂钩一样,数组脚标一样的,一个一个的节点往下挂. ​ 我们可以看源码来验证下,HashMap 的数据结构是不是真的是像上面所说是数组加链表的形式: //此处略过其他代码,只截取出了hashMap的数组结构相关的数组与链表 public class HashMap<K,V> extends AbstractMap<K,V> implements M…
大家可能平时用HashMap比较多,相对于ConcurrentHashMap 来说并不是很熟悉.ConcurrentHashMap 是 JDK 1.5 添加的新集合,用来保证线程安全性,提升 Map 集合的并发效率.ConcurrentHashMap 使用了 Segment 的概念,默认有 16 个 Segment(段,块,部分),Segment 里面依然还是数组 + 链表的数据结构,相当于给 HashMap 分桶处理了.因每次只会锁住其中一个 Segment,所以性能非常好.然而,有意思的是,…