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