
JAVA8-集合类源码
文章平均质量分 70
淡定一生2333
这个作者很懒,什么都没留下…
展开
-
PriorityQueue如何确定构建的是大根堆还是小根堆
如下是PriorityQueue类中新放入元素时执行的代码,x是新放入的元素,k是队列大小,这里只要关注x就好了。可以看到满足 comparator.compare(x, (E) e) >= 0 时会跳出循环,e是队列中原先就存在的元素,此时如果o2-o1>=0,即e>=x时,x会停止往堆顶上升。此时如果o1-o2>=0,即x>=e时,x会停止往堆顶上升。否则如果o1-o2原创 2023-09-26 08:33:28 · 150 阅读 · 0 评论 -
JAVA中优先队列PriprityQueue详解
Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度,将让读者建立对PriorityQueue建立清晰而深入的认识。总体介绍前面以JavaArrayDeque为例讲解了Stack和Queue,其实还有一种特殊的队列叫做PriorityQueue,即优先队列。优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++.转载 2020-06-03 22:44:08 · 3810 阅读 · 0 评论 -
JDK8-ArrayList源码分析
由于ArrayList底层是基于Object[]实现的,所以随机读的效率很高,插入和删除需要移动整个数组,效率很低.和Vector不同,ArrayList不是线程安全的.可以理解为Vector就是线程安全的ArrayList… 属性介绍: /** * Default initial capacity. */ private static fi...原创 2018-09-08 15:56:29 · 1694 阅读 · 2 评论 -
LinkedList源码分析
LinkedList是底层基于链表的一种数据结构。其中每一个节点称为一个Node,结构如下:从Node结构中可以看出,LinkedList是一个双向链表,那对它的操作就是对双向链表的操作。首先来分析下它的属性:transient int size = 0;/** * Pointer to first node. * Invariant: (first == null &...原创 2018-11-15 23:04:16 · 150 阅读 · 0 评论 -
ConcurrentHashMap源码分析
ConcurrentHashMap内部使用的数据结构和HashMap类似,使用 数组+链表+红黑树来实现,并发安全使用 CAS+synchronize保证安全。 Jdk1.7中的ConcurrentHashMap实现概览:JDK1.7中同步使用的是锁分段技术,每个segment继承ReentrantLock。在put操作时,多相处同时竞争获取同一个segment锁。获取成功的线程更...原创 2018-12-19 21:33:48 · 678 阅读 · 0 评论 -
HashMap源码分析
首先比较下HashMap 与 HashTable的不同之处:HashTable如果插入key/value为null的值时会报错,但是hashmap不会。在hashmap中,null是作为第0个元素的,相当于是做了特殊化处理。前者是非线程安全的,后者是线程安全的。 后者线程安全的原因就是因为后者的每一个方法上都有一个synchronized,这样虽然保障了线程安全,但是每次都要锁整个Clas...原创 2018-12-16 23:04:00 · 211 阅读 · 0 评论 -
LinkedHashMap源码分析
LinkedHashMap是HashMap的子类,和HashMap不同的是它内部还使用了一个双向链表将所有元素连接在了一起,然后基于这个双向链表实现了FIFO和LRU两种元素访问策略。本文的目的是连接LinkedHashMap内部的实现机制,然后基于它实现一个简单的LRU。LinkedHashMap中每个元素的数据结构如下:可以看出它是对HashMap的Node结构进行了拓展...原创 2019-07-02 19:38:37 · 279 阅读 · 0 评论