![](https://img-blog.csdnimg.cn/20201123113839812.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java中的集合框架
JDK8中的各种集合类源码分析
开水格
修行之道: 关注大师的言行, 跟随大师的举动, 和大师一并修行, 领会大师的意境, 成为真正的大师。
编程是一门技术,更是一门艺术。
展开
-
JDK8系列:Set集合 之 TreeSet源码分析
1、TreeSet 简介TreeSet实现了SortedSet接口,它是一个有序的集合类,TreeSet的底层是通过TreeMap实现的。TreeSet并不是根据插入的顺序来排序,而是根据实际的值的大小来排序。TreeSet也支持两种排序方式:自然排序 自定义排序2、成员变量使用 map 的key来保存set集合的元素,而value是一个已经定义好的成员变量(全部的value都一样)各种 Set集合都是这么实现的public class TreeSet<E>..原创 2020-10-29 08:51:57 · 265 阅读 · 0 评论 -
JDK8系列:List集合 之 LinkedList 源码分析
1、LinkedList 简介2、成员变量public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable.原创 2020-10-29 08:52:26 · 213 阅读 · 0 评论 -
JDK8系列:List集合 之 ArrayList 源码分析
1、ArrayList 简介1)ArrayList是可以动态增长和缩减的索引序列,它是基于数组实现的List类。2)该类封装了一个动态再分配的Object[]数组,每一个类对象都有一个capacity属性,表示它们所封装的Object[]数组的长度,当向ArrayList中添加元素时,该属性值会自动增加。 如果想ArrayList中添加大量元素,可使用ensureCapacity方法一次性增加capacity,可以减少增加重分配的次数提高性能。3)ArrayList的用...原创 2020-10-29 08:52:13 · 187 阅读 · 0 评论 -
JDK8系列:Collection接口 AND AbstractCollection抽象类
1、Collection 接口1.1、简介List和Set都是接口,它们继承与Collection。List是有序的队列,可以用重复的元素;而Set是数学概念中的集合,不能有重复的元素。List和Set都有它们各自的实现类。为了方便,我们抽象出AbstractCollection类来让其他类继承,该类实现类Collection中的绝大部分方法。AbstractList和AbstractSet都继承与AbstractCollection,具体的List实现类继承与Abstract...原创 2020-12-11 15:42:52 · 130 阅读 · 0 评论 -
JDK8系列:刨根问底 之 List集合
对于数组我们应该很熟悉,一个数组在内存中总是一块连续的存储空间,数组的创建使用new关键字,数组是引用类型的数据,一旦第一个元素的位置确定,那么后面的元素位置也就确定了,数组有一个最大的局限就是数组一旦创建,他的长度就是固定的,不可以进行更改,如果数组空间不够大,唯一的方法就是再创建一个大的数组,把原来的数组元素拷贝过去。为了使程序鞥狗方便的存储和操作数量不固定的数据,java加入了集合个概念,和数组最大的区别也就是长度可以改变,是一种动态的调整。在java中一共有三种集合分别是List,Set,M原创 2020-10-29 08:51:38 · 342 阅读 · 0 评论 -
JDK8系列:Set集合 之 LinkedHashSet 源码分析
1、LinkedHashSet 简介对于LinkedHashSet而言,它继承与HashSet、又基于LinkedHashMap来实现的。LinkedHashSet底层使用LinkedHashMap来保存所有元素,它继承与HashSet,其所有的方法操作上又与HashSet相同,因此LinkedHashSet的实现上非常简单,只提供了四个构造方法,并通过传递一个标识参数,调用父类的构造器,底层构造一个LinkedHashMap来实现,在相关操作上与父类HashSet的操作相同,直接调用父类...原创 2020-10-29 08:52:58 · 279 阅读 · 0 评论 -
JDK8系列:Set集合 之 HashSet源码分析
1、HashSet 简介通过内部使用的 hashMap 保持元素的唯一性。这个hashMap 的组成是 :key是set种的元素,但value全是PRESENTSet没有 get()方法,因为没有实际意义。Set中的元素没有顺序,根本不可能通过 index 取。但是Set有迭代器遍历元素2、成员变量public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneab..原创 2020-10-29 08:52:43 · 190 阅读 · 0 评论 -
JDK8系列:刨根问底 之 Set
1、Set 接口1.1、Set 简介Collection接口是集合类的根接口,它没有具体的实现,但是让其两个儿子Set和List,其中Set中不能包含重复的元素。List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式。1.2、源码分析public interface Set<E> extends Collection<E> { // 查询操作 int size(); boolean isEmpty(); bo.原创 2020-10-29 08:51:21 · 360 阅读 · 0 评论 -
JDK8系列:阻塞队列 之 LinkedBlockingDeque(双向阻塞队列)源码解析
1、LinkedBlockingDeque 简介LinkedBlockingDeque是一个基于链表的双端阻塞队列。和LinkedBlockingQueue类似,区别在于该类实现了Deque接口,而LinkedBlockingQueue实现了Queue接口。该类的继承关系如下图:容量问题LinkedBlockingDeque是一个可选容量的阻塞队列,如果没有设置容量,那么容量将是Int的最大值。底层数据结构LinkedBlockingDeque的底层数据结构是一个双端队列,该队列使用链.原创 2020-11-07 15:08:57 · 429 阅读 · 0 评论 -
JDK8系列:阻塞队列 之 LinkedTransferQueue(无界阻塞队列)源码解析
1、LinkedTransferQueue 简介是一个由链表结构构成的无界阻塞TransferQueue队列。相对于其他阻塞队列,多了 tryTransfer 和 transfer 方法。LinkedTransferQueue是LinkedBlockingQueue、SynchronousQueue(公平模式)、ConcurrentLinkedQueue三者的集合体,它综合了这三者的方法,并且提供了更加高效的实现方式。2、成员变量 和 构造方法public class Linked..原创 2020-11-07 15:09:14 · 475 阅读 · 0 评论 -
JDK8系列:阻塞队列 之 SynchronousQueue(同步队列)源码分析
1、SynchronousQueue 简介1. 整个 queue 没有容量, 表现为, 你每次进行put值进去时, 必须等待相应的 consumer 拿走数据后才可以再次 put 数据2. queue 对应 peek, contains, clear, isEmpty ... 等方法其实是无效的3. 整个 queue 分为 公平(TransferQueue FIFO)与非公平模式(TransferStack LIFO 默认)4. 若使用 TransferQueue, 则队列中永远会存在一个 d.原创 2020-11-06 21:40:49 · 498 阅读 · 0 评论 -
JDK8系列:阻塞队列 之 DelayQueue(延迟队列)源码分析
1、DelayQueue 简介DelayQueue 是一个支持延时获取元素的无界阻塞队列,队列使用PriorityQueue来实现,队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素,只有在延时期满时才能从队列中提取元素。列头的元素是最先“到期”的元素。PriorityQueue 是一种优先级的队列,队列中的元素会按照优先级进行排序,我们在前面讲过PriorityBlockingQueue,PriorityQueue其实现原理也是使用的二叉堆,因此这次将不会再分原创 2020-11-09 15:58:59 · 927 阅读 · 0 评论 -
JDK8系列:阻塞队列 之 PriorityBlockingQueue(优先级队列)源码分析
1、PriorityBlockingQueue 简介(1)PriorityBlockingQueue整个入队出队的过程与PriorityQueue基本是保持一致的;(2)PriorityBlockingQueue使用一个锁+一个notEmpty条件控制并发安全;(3)PriorityBlockingQueue扩容时使用一个单独变量的CAS操作来控制只有一个线程进行扩容;(4)入队使用自下而上的堆化;(5)出队使用自上而下的堆化;该阻塞队列每次取出的都是最小的对象(小顶堆!!!),原创 2020-11-06 21:39:49 · 536 阅读 · 1 评论 -
JDK8系列:阻塞队列 之 LinkedBlockingQueue(有界阻塞队列)源码解析
1、LinkedBlockingQueue 简介线程安全底层实现原理:单项链表 + 2个ReentrantLock + 2个Condition生产和消费数据用的不是同一独占锁,生产和消费是可以同时进行生产者从队尾添加数据,消费者从队头的下一个节点开始获取数据生产数据达到了容量则生产线程等待,消费者消费完了数据则消费者线程等待头节点的数据项为null,不允许添加的数据项为null2、成员变量 和 构造方法public class LinkedBlockingQueue<..原创 2020-11-02 10:34:52 · 3315 阅读 · 0 评论 -
JDK8系列:阻塞队列 之 ArrayBlockingQueue(有界阻塞队列)源码解析
4、ArrayBlockingQueue 类4.1、简介一个由数组支持的有界阻塞队列。它的本质是一个基于数组的BlockingQueue的实现。它的容纳大小是固定的。此队列按FIFO(先进先出)原则对元素进行排序。队列的头部是在队列中存在时间最长的元素。队列的尾部是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不...原创 2020-11-02 10:35:10 · 416 阅读 · 0 评论 -
JDK8系列:刨根问底 之 队列
1、Queue 接口public interface Queue<E> extends Collection<E> { // 将元素添加到这个队列中,但是如果没有可用空间,则抛出异常IllegalStateException boolean add(E e); // 入队 boolean offer(E e); // 移除头部或者如果队列为空。则返回null E remove(); // 出队 E poll原创 2020-11-02 10:34:32 · 254 阅读 · 0 评论 -
JDK8系列:Iterable、Iterator、Spliterator 迭代器
1、Iterable 接口Iterable,即迭代器的意思。其作用是为集合类提供for-each循环遍历的支持,只要让一个类实现这个接口,该类的对象就可以成为for-each循环遍历的目标。换句话说,想让一个Java对象支持for-each遍历,只要让它的类实现Iterable接口即可。public interface Iterable<T> { // 在类型的元素上返回迭代器 Iterator<T> iterator(); // 对Iterab原创 2020-11-06 21:39:26 · 951 阅读 · 0 评论 -
ConcurrentHashMap 源码分析(JDK1.7)
1、原理分析原创 2020-10-27 22:14:19 · 217 阅读 · 0 评论 -
ConcurrentHashMap 在 JDK1.7 和 JDK1.8之间的区别 与 联系
1、JDK1.7中的特点2、JDK1.8中的特点3、联系4、区别5、JDK1.8相对于JDK1.7的进步点原创 2020-10-27 22:14:59 · 778 阅读 · 0 评论 -
ConcurrentHashMap 源码深入分析(JDK1.8)
1、ConcurrentHashMap 简介1.1、ConcurrentHashMap 与 HashMap 、 Hashtable 的比较HashMap不是线程安全的,所以在处理并发的时候会出现问题。而HashTable虽然是线程安全的,但是是通过整个来加锁的方式,当一个线程在写操作的时候,另外的线程则不能进行读写。而ConcurrentHashMap则可以支持并发的读写。跟1.7...原创 2020-10-27 22:12:57 · 262 阅读 · 0 评论 -
Hashtable 与 HashMap 的区别(JDK1.8)
1、HashMap 简介HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。节点数量过多时,还会转化为红黑树。 HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。 HashMap实现了S...原创 2020-11-07 15:09:56 · 154 阅读 · 0 评论 -
HashMap 源码分析(JDK1.8 只分析了重点)
1、HashMap 简介1.1、常用数据结构数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n) ...原创 2020-11-07 15:09:42 · 473 阅读 · 0 评论