java集合
文章平均质量分 93
java集合,一起通过源码来学习集合的方方面面。
df007df
帮助大家从容面对面试,弥补平时工作中因没有时间而遗忘的八股文。
提供面经突击内容,作为面试突击或补齐多年Java基本功必备。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【Java面试突击-4】Java容器(中)
Map HashMap 和 Hashtable 的区别 线程是否安全: HashMap 是非线程安全的,Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!); 效率: 因为线程安全的问题,HashMap 要比 Hashtable 效率高一点。另外,Hashtable 已被淘汰,不要在代码中使用它; 对 Null key 和 Null value 的支持: Has原创 2022-05-31 14:44:40 · 267 阅读 · 0 评论 -
【Java面试突击-4】Java容器(上)
概述 容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。对于Collection 接口,下面又有三个主要的子接口:List、Set 和 Queue。 Collection List ArrayList:基于动态数组实现,支持随机访问。增加和删除(arraycopy实现)元素慢。 Vector:和 ArrayList 类似,但它是线程安全的。底层是通过数组与synchronized实现的。是线程安全的。现在弃用。 Lin原创 2022-05-30 13:56:40 · 488 阅读 · 0 评论 -
[学习笔记-Java集合] 目录
本系列开始记录针对java集合体系的相关源码学习。大部分来之网络内容,只是自己整理与总结之用。 分为5大块 List List中的元素是有序的、可重复的,主要实现方式有动态数组和链表。 ArrayList LinkedList CopyOnWriteArrayList Map HashMap LinkedHashMap WeakHashMap ConcurrentHashMap 源码分析(...原创 2019-08-08 00:00:00 · 113 阅读 · 0 评论 -
[学习笔记-Java集合-1] List - ArrayList源码分析
简介 ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组。 继承体系 ArrayList实现了List, RandomAccess, Cloneable, java.io.Serializable等接口。 ArrayList实现了List,提供了基础的添加、删除、遍历等操作。 ArrayList实现了RandomAccess,提供了随机访问...原创 2019-08-08 00:00:00 · 119 阅读 · 0 评论 -
[学习笔记-Java集合-2] List - LinkedList源码分析
介绍 LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用,它是怎么实现的呢?让我们一起来学习吧。 继承体系 通过继承体系,我们可以看到LinkedList不仅实现了List接口,还实现了Queue和Deque接口,所以它既能作为List使用,也能作为双端队列使用,当然也可以作为栈使用。 源码分析 主要属性 // 元素个数 transient i...原创 2019-08-10 00:00:00 · 126 阅读 · 0 评论 -
[学习笔记-Java集合-3] List - CopyOnWriteArrayList源码分析
简介 CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过数组实现,每次对数组的修改都完全拷贝一份新的数组来修改,修改完了再替换掉老数组,这样保证了只阻塞写操作,不阻塞读操作,实现读写分离。 继承体系 CopyOnWriteArrayList实现了List, RandomAccess, Cloneable, java.io.Serializable等接口。...原创 2019-08-10 00:00:00 · 136 阅读 · 0 评论 -
[学习笔记-Java集合-4] Map - HashMap源码分析
简介 HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改的速度都很快,能达到O(1)的平均时间复杂度。它是非线程安全的,且不保证元素存储的顺序; 继承体系 HashMap实现了Cloneable,可以被克隆。 HashMap实现了Serializable,可以被序列化。 HashMap继承自AbstractMap,实现了Map接口,具有Map的所有功能。 ...原创 2019-08-12 00:00:00 · 150 阅读 · 0 评论 -
[学习笔记-Java集合-5]Map - LinkedHashMap源码分析
简介 LinkedHashMap内部维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用来实现LRU缓存策略。 LinkedHashMap可以看成是 LinkedList + HashMap。 继承体系 LinkedHashMap继承HashMap,拥有HashMap的所有特性,并且额外增加的按一定顺序访问的特性 存储结构 我们知道HashMap使用(数组 + 单链表 ...原创 2019-08-12 00:00:00 · 144 阅读 · 0 评论 -
[学习笔记-Java集合-6] Map - WeakHashMap源码分析
介绍 WeakHashMap是一种弱引用map,内部的key会存储为弱引用,当jvm gc的时候,如果这些key没有强引用存在的话,会被gc回收掉,下一次当我们操作map的时候会把对应的Entry整个删除掉,基于这种特性,WeakHashMap特别适用于缓存处理。 继承体系 WeakHashMap没有实现Clone和Serializable接口,所以不具有克隆和序列化的特性。 存储结构 Weak...原创 2019-08-14 00:00:00 · 128 阅读 · 0 评论 -
[学习笔记-Java集合-7] Map - ConcurrentHashMap 源码分析(一)
简介 ConcurrentHashMap是HashMap的线程安全版本,内部也是使用(数组 + 链表 + 红黑树)的结构来存储元素。 相比于同样线程安全的HashTable来说,效率等各方面都有极大地提高。 用到锁的简介 这里先简单介绍一下各种锁,以便下文讲到相关概念时能有个印象。 synchronized java中的关键字,内部实现为监视器锁,主要是通过对象监视器在对象头中的字段来表明的...原创 2019-08-17 00:00:00 · 137 阅读 · 0 评论 -
[学习笔记-Java集合-8] Map - ConcurrentHashMap 源码分析(二)
删除元素 删除元素跟添加元素一样,都是先找到元素所在的桶,然后采用分段锁的思想锁住整个桶,再进行操作。 public V remove(Object key) { // 调用替换节点方法 return replaceNode(key, null, null); } final V replaceNode(Object key, V value, Object cv) { ...原创 2019-08-17 00:00:00 · 156 阅读 · 0 评论 -
[学习笔记-Java集合-9] Set - HashSet源码分析
简介 集合,这个概念有点模糊。 广义上来讲,java中的集合是指java.util包下面的容器类,包括和Collection及Map相关的所有类。 中义上来讲,我们一般说集合特指java集合中的Collection相关的类,不包含Map相关的类。 狭义上来讲,数学上的集合是指不包含重复元素的容器,即集合中不存在两个相同的元素,在java里面对应Set。 具体怎么来理解还是要看上下文环境。比如...原创 2019-08-17 00:00:00 · 156 阅读 · 0 评论 -
[学习笔记-Java集合-10] Set - LinkedHashSet源码分析
介绍 上一节我们说HashSet中的元素是无序的,那么有没有什么办法保证Set中的元素是有序的呢? 答案是当然可以。 LinkedHashSet就有这个功能,它是怎么实现有序的呢? 源码分析 LinkedHashSet继承自HashSet,让我们直接上源码来看看它们有什么不同。 package java.util; // LinkedHashSet继承自HashSet public class...原创 2019-08-17 00:00:00 · 134 阅读 · 0 评论 -
[学习笔记-Java集合-11] Map - ConcurrentSkipListMap源码分析
介绍 跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。 跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。 跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。 存储结构 跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。 源码分析 主要内部类 内部类跟存储结构结合着来看,大概能预测到代码的组织方式。 // 数据节点,典型的单链表结构 s...原创 2019-08-18 00:00:00 · 131 阅读 · 0 评论 -
[学习笔记-Java集合-12] Set - CopyOnWriteArraySet源码分析
介绍 CopyOnWriteArraySet底层是使用CopyOnWriteArrayList存储元素的,所以它并不是使用Map来存储元素的。 但是,我们知道CopyOnWriteArrayList底层其实是一个数组,它是允许元素重复的,那么用它来实现CopyOnWriteArraySet怎么保证元素不重复呢? 源码分析 Set类的源码一般都比较短,所以我们直接贴源码上来一行一行分析吧。 pub...原创 2019-08-18 00:00:00 · 145 阅读 · 0 评论 -
[学习笔记-Java集合-13] Set - ConcurrentSkipListSet源码分析
介绍 ConcurrentSkipListSet底层是通过ConcurrentNavigableMap来实现的,它是一个有序的线程安全的集合。 源码分析 它的源码比较简单,跟通过Map实现的Set基本是一致,只是多了一些取最近的元素的方法。 // 实现了NavigableSet接口,并没有所谓的ConcurrentNavigableSet接口 public class ConcurrentSki...原创 2019-08-18 00:00:00 · 155 阅读 · 0 评论 -
[学习笔记-Java集合-14] Queue - PriorityQueue源码分析
介绍 优先级队列,是0个或多个元素的集合,集合中的每个元素都有一个权重值,每次出队都弹出优先级最大或最小的元素。 一般来说,优先级队列使用堆来实现。 源码分析 主要属性 // 默认容量 private static final int DEFAULT_INITIAL_CAPACITY = 11; // 存储元素的地方 transient Object[] queue; /...原创 2019-08-20 00:00:00 · 131 阅读 · 0 评论 -
[学习笔记-Java集合-15] Queue - ArrayBlockingQueue源码分析
介绍 ArrayBlockingQueue是java并发包下一个以数组实现的阻塞队列,它是线程安全的,至于是否需要扩容,请看下面的分析。 队列 队列,是一种线性表,它的特点是先进先出,又叫FIFO,就像我们平常排队一样,先到先得,即先进入队列的人先出队。 源码分析 主要属性 // 使用数组存储元素 final Object[] items; // 取元素的指针 int takeIndex; ...原创 2019-08-21 00:00:00 · 145 阅读 · 0 评论 -
[学习笔记-Java集合-16] Queue - LinkedBlockingQueue源码分析
介绍 LinkedBlockingQueue是java并发包下一个以单链表实现的阻塞队列,它是线程安全的,至于它是不是有界的,请看下面的分析。 源码分析 主要属性 // 容量 private final int capacity; // 元素数量 private final AtomicInteger count = new AtomicInteger(); // 链表头 transient...原创 2019-08-22 00:00:00 · 127 阅读 · 0 评论 -
[学习笔记-Java集合-17] Queue - DelayQueue源码分析
介绍 DelayQueue是java并发包下的延时阻塞队列,常用于实现定时任务。 继承体系 从继承体系可以看到,DelayQueue实现了BlockingQueue,所以它是一个阻塞队列。 另外,DelayQueue还组合了一个叫做Delayed的接口,DelayQueue中存储的所有元素必须实现Delayed接口。 那么,Delayed是什么呢? public interface Delay...原创 2019-08-24 00:00:00 · 122 阅读 · 0 评论
分享