
Java集合
文章平均质量分 86
橡 皮 人
代码传递思想,技术创造回响。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java集合中fail-fast和fail-safe机制详解
在使用集合时候,大家应该都遇到过或听过并发修改异常(ConcurrentModificationException),这其实是Java集合中的一种fail-fast机制,为了避免触发fail-fast机制,Java中还提供了一些采用fail-safe机制的集合类,本篇文章就系统的介绍一下这两种机制。原创 2024-08-15 07:30:00 · 1347 阅读 · 0 评论 -
集合总结及部分集合概述
集合三巨头——HashMap、ConcurrentHashMap及ArrayList深入学习完毕(这三种最常用),剩下的相对不常用的比如Map系列的treeMap、HashTable,Set系列的HashSet、TreeSet,List系列的Vector、LinkedList,Queue系列的Blocking、Deque、PriorityQueue等,其中可能有些在之前的介绍中稍微提了一下,不过太过零散,本篇就统一总结概述下。原创 2024-08-08 07:30:00 · 1072 阅读 · 0 评论 -
ArrayList详解
List允许有重复元素、且存储有序,实现主要有ArrayList、CopyOnWriteArrayList、Vector和LinkedList:ArrayList:底层是数组,查询快,增删慢,线程不安全CopyOnWriteArrayList:底层是数组,读写分离,线程安全,效率较Vector高效,不过内存消耗较大。(add和remove等操作都加了ReentrantLock锁,当写的时候COW会先从原数组拷贝一份,然后在新的数组上做些操作,写完之后再将原数组引用指向新数组,读操作没有锁)原创 2024-08-01 07:30:00 · 964 阅读 · 0 评论 -
ConcurrentHashMap第2讲——剩下的细节
上篇文章对ConcurrentHashMap在put、初始化和扩容阶段的并发控制做了介绍,并分析了其相应的源码,不过这里面还有一些细节和知识点没介绍,比如jdk 1.7的分段锁用的是ReentrantLock而jdk1.8用的是synchronized+cas,为什么不继续用ReentrantLock?我们知道ConcurrentHashMap的值不允许为null,而HashMap可以为null,这也是它俩的一个不同点,还有就是ConcurrentHashMap的扩容时机、什么时候转红黑树,和HashMap原创 2024-07-25 07:30:00 · 1028 阅读 · 0 评论 -
ConcurrentHashMap第1讲——哪些地方做了并发控制
我们知道在多线程环境下,HashMap在初始化桶数组、put桶、插入链表以及树化等阶段都有线程安全问题,在jdk1.5之前我们通常用HashTable或包装过的HashMap来保证线程安全,不过它们在执行任何操作时都需要锁住整个hash表,这显著的限制了并发性能,所以在jdk1.5我们的并发大神Doug Lea设计一个高性能且线程安全的集合——ConcurrentHashMap。ps:本文默认是jdk1.8版本,如有别的版本会强调那么ConcurrentHashMap在哪些地方做了并发控制呢。原创 2024-07-18 07:30:00 · 1244 阅读 · 0 评论 -
HashMap第7讲——get方法源码分析
HashMap最后一篇啦,下篇就进入ConcurrentHashMap的学习和总结了。原创 2024-07-11 07:30:00 · 273 阅读 · 0 评论 -
HashMap第6讲——remove方法源码分析
前面把HashMap的扩容和put操作,以及很多细节都介绍完了,那么剩下的打算再介绍下remove和get操作的源码分析就可以收官了,有了前面的铺垫,这两篇就相对比较轻松😂。原创 2024-07-04 07:30:00 · 558 阅读 · 0 评论 -
HashMap第5讲——resize方法扩容源码分析及细节
put方法的源码和相关的细节已经介绍完了,下面我们进入扩容功能的讲解。一、为什么需要扩容这个也比较好理解。假设现在HashMap里的元素已经很多了,但是链化比较严重,即便树化了,查询效率也是O(logN),肯定没有O(1)好,所以需要扩容来降低Hash冲突的概率,提高性能。二、触发扩容的临界我们知道,当++size>threshold条件成立时,就会调用resize()方法进行扩容。原创 2024-06-27 07:30:00 · 1306 阅读 · 0 评论 -
HashMap第4讲——如何保证容量为2^n(源码分析)
在介绍的时候,提到了为了让位运算(&)替代取模运算(%),HashMap的容量只能是2^n,这是如何做到的呢?还有就是HashMap的容量设置为多少合适呢?原创 2024-06-20 07:30:00 · 967 阅读 · 0 评论 -
HashMap第3讲——JDK1.8红黑树细节
上篇文章对HashMap的put方法进行了源码解析,并介绍了其中的两个亮点设计——位运算取代%和扰动计算。其中还有几个细节,比如每次扩容都是2^n是怎么做到的、JDK1.8增加的红黑树结构,由于篇幅原因没有介绍,这节就先来介绍其中的一个细节——红黑树。原创 2024-06-13 07:30:00 · 1007 阅读 · 0 评论 -
HashMap第2讲——put方法源码及细节
上篇文章介绍了HashMap在JDK 1.8前后的4大变化,今天就进入到put方法的源码解析。HashMap的设计非常巧妙,细节也很多,今天来看看部分细节,后续的文章会一一介绍。ps:学习源码的目的不仅仅是为了了解它的运行机制,更重要的是学习它的思想和编码技巧,每一行的源码都可能都经过了“千锤百炼”,才得以呈现在大家眼前。原创 2024-06-06 07:30:00 · 1019 阅读 · 0 评论 -
HashMap第1讲——JDK 1.8版本前后的变化
今天开始就进入Java集合的学习和总结了,我是这样打算的:集合三巨头——HashMap、ConcurrentHashMap和ArrayList会详细介绍(源码+细节),其它比如HashTable、Vector、HashSet、TreeSet等,会根据面试点介绍,必要时也会介绍部分源码。那么下面我们开始介绍集合第一篇文章吧。ps:HashMap的知识点还是挺多的,所以要分多次介绍,本节就先着重介绍HashMap JDK1.8版本前后的变化。原创 2024-05-30 07:15:00 · 1169 阅读 · 0 评论