随笔分类 - 集合容器
HashMap,ConcurrentHashMap,HashTable
摘要:Doug Lea 是 Java 并发编程领域的知名专家,他曾经是 Java 并发包的主要设计者之一,也是 Java 并发编程的重要贡献者。对于 ConcurrentHashMap 不允许插入 null 值的问题,有人问过 Doug Lea,以下是他回复的邮件内容: 1 The main reason
阅读全文
摘要:我们都知道 HashMap 不是线程安全的,而 ConcurrentHashMap 和 Hashtable 它们两个确实都是线程安全的,那它们有哪些不同点呢? 出现的版本不同 Hashtable 在 JDK1.0 的时候就存在了,并在 JDK1.2 版本中实现了 Map 接口,成为了集合框架的一员。
阅读全文
摘要:Java 7 版本的 ConcurrentHashMap 结构示意图: 从图中我们可以看出,在 ConcurrentHashMap 内部进行了 Segment 分段,Segment 继承了 ReentrantLock,可以理解为一把锁,各个 Segment 之间都是相互独立上锁的,互不影响。相比于之
阅读全文
摘要:为什么 Map 桶中超过 8 个才转为红黑树? 我们知道Java8后,当Map链表长度大于或等于阈值TREEIFY_THRESHOLD(默认为 8)的时候,如果同时还满足容量(数组的长度)大于或等于 MIN_TREEIFY_CAPACITY(默认为 64)的要求,就会把链表转换为红黑树。同样,后续如
阅读全文
摘要:蜜源 (1)HashMap 与 HashTable 的对比? YY (1)HashMap 1.7, 1.8 的主要区别, 除了树化,扩容后不需要重新计算hash 还有什么? (2)ConcurrentHashMap 1.7 与 1.8 的区别, 1.7 的分段锁,分了多少段呢? 1.8 还优化了什么
阅读全文
摘要:我们将通过以下几个问题进行解答分析: (1)HashMap 底层实现原理是什么?JDK8 做了哪些优化? (2)HashMap 的工作原理?HashMap中链表的作用? (3)为什么要添加红黑树?为什么链表大于 8才转? (4)加载因子是什么?为什么是0.75? (5)HashMap 是如何导致死循
阅读全文
摘要:从源码的角度 (1)HashMap的put()方法中,有modCount++的操作,即调用put()时,修改次数加1,“i++”操作,从表面上看 i++ 只是一行代码,但实际上它并不是一个原子操作,它的执行步骤主要分为三步,而且在每步操作之间都有可能被打断。 (1)第一个步骤是读取; (2)第二个步
阅读全文