java集合源码
文章平均质量分 86
wangzhipeng47
这个作者很懒,什么都没留下…
展开
-
Hashmap实现原理及hash冲突(碰撞)解决方法
HashMap的实现原理及hash冲突(碰撞)解决方法HashMap 采用一种所谓的“Hash算法”来决定每个元素的存储位置。当程序执行 map.put(String,Obect)方法 时,系统将调用String的 hashCode() 方法得到其 hashCode 值——每个 Java 对象都有 hashCode() 方法,都可通过该方法获得它的 hashCode 值。得到这个对象的 hashCode 值之后,系统会根据该 hashCode 值来决定该元素的存储位置。源码如下:public...原创 2021-06-05 22:28:43 · 4836 阅读 · 0 评论 -
java线程池原理
线程池的技术背景在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些”池化资源”技术产生的原因。例如Android中常见到的很多通用组件一般都离不开”池”的概念,如各种图片加载库,网络请求库,即使And...原创 2021-06-04 02:34:02 · 347 阅读 · 0 评论 -
原创-Hashmap1.7和1.8有哪些区别
(一) 真实面试题之:Hashmap的结构,1.7和1.8有哪些区别不同点:(1)JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。(2)扩容后数据存储位置的计算方式也不一样:1. 在JDK1.7的时候是直接用hash值和需要扩容的二进制数进行&(这里就是为什么扩容的时候原创 2021-06-04 02:24:16 · 359 阅读 · 0 评论 -
Java集合类源码分析汇总
首页 博客 专栏·视频 下载 论坛 问答 代码 直播 能力认证 高校会员中心收藏动态消息创作中心Java集合类源码分析汇总舟2016-07-16 21:23:482253收藏2转自:http://www.cnblogs.com/hzmark/archive/2013/01/05/JavaCollectionSum.htmlJava集合类基础:http://www.cnblogs.com/hzmark/archive/20...转载 2021-05-15 02:10:02 · 223 阅读 · 0 评论 -
原创--深入AQS原理
【深入AQS原理】我画了35张图就是为了让你深入 AQS前言谈到并发,我们不得不说AQS(AbstractQueuedSynchronizer),所谓的AQS即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore等都是基于AQS来实现的。我们先看下AQS相关的UML图:image.png思维导图:image.pngAQS实现原理AQS中 维护了一原创 2021-05-12 19:25:04 · 137 阅读 · 0 评论 -
ConcurrentHashMap性能提升
ConcurrentHashMap中有十个提升性能的细节,你都知道吗?一些题外话如何在高并发下提高系统吞吐是所有后端开发者追求的目标,Java并发的开创者Doug Lea在Java 7 ConcurrentHashMap的设计中给出了一些参考答案,本文详细的总结了ConcurrentHashMap源码中影响并发性能的十个细节,有常见的自旋锁,CAS的使用,也有延迟写内存,volatile语义退化等不常见的技巧,希望对大家的开发设计有所帮助。由于ConcurrentHashMap的内容比较多,而且原创 2021-05-12 19:22:52 · 525 阅读 · 0 评论 -
HashMap 夺命二十一问,必看系列!
真题:HashMap 夺命二十一问,必看系列!1:HashMap 的数据结构?A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过 8 时,链表转换为红黑树。transient Node<K,V>\[\] table;2:HashMap 的工作原理?HashMap 底层是 hash 数组和单向链表实现,数组中的每个元素都是链表,由 Node 内部类(实现 Map.Entry接口)实现,HashMap 通过 put & get..原创 2020-07-30 15:46:51 · 311 阅读 · 0 评论 -
【死磕 Java 集合】— LinkedList源码分析
【死磕 Java 集合】— LinkedList源码分析问题(1)LinkedList只是一个List吗?(2)LinkedList还有其它什么特性吗?(3)LinkedList为啥经常拿出来跟ArrayList比较?(4)我为什么把LinkedList放在最后一章来讲?简介LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用,它是怎么实现的呢?让我们一起来学习吧。继承体系通过继承体系,我们可以看到L...原创 2020-07-06 07:07:19 · 121 阅读 · 0 评论 -
【死磕 Java 集合】— ArrayDeque源码分析
【死磕 Java 集合】— ArrayDeque源码分析问题(1)什么是双端队列?(2)ArrayDeque是怎么实现双端队列的?(3)ArrayDeque是线程安全的吗?(4)ArrayDeque是有界的吗?简介双端队列是一种特殊的队列,它的两端都可以进出元素,故而得名双端队列。ArrayDeque是一种以数组方式实现的双端队列,它是非线程安全的。继承体系通过继承体系可以看,ArrayDeque实现了Deque接口,Deque接口继承自Queue接口...原创 2020-07-06 07:06:18 · 105 阅读 · 0 评论 -
【死磕 Java 集合】— DelayQueue源码分析
【死磕 Java 集合】— DelayQueue源码分析问题(1)DelayQueue是阻塞队列吗?(2)DelayQueue的实现方式?(3)DelayQueue主要用于什么场景?简介DelayQueue是java并发包下的延时阻塞队列,常用于实现定时任务。继承体系从继承体系可以看到,DelayQueue实现了BlockingQueue,所以它是一个阻塞队列。另外,DelayQueue还组合了一个叫做Delayed的接口,DelayQueue中存储...原创 2020-07-06 07:05:19 · 107 阅读 · 0 评论 -
【死磕 Java 集合】— ConcurrentLinkedQueue源码分析
【死磕 Java 集合】— ConcurrentLinkedQueue源码分析问题(1)ConcurrentLinkedQueue是阻塞队列吗?(2)ConcurrentLinkedQueue如何保证并发安全?(3)ConcurrentLinkedQueue能用于线程池吗?简介ConcurrentLinkedQueue只实现了Queue接口,并没有实现BlockingQueue接口,所以它不是阻塞队列,也不能用于线程池中,但是它是线程安全的,可用于多线程环境中。那...原创 2020-07-06 07:04:26 · 168 阅读 · 0 评论 -
【死磕 Java 集合】— LinkedTransferQueue源码分析
【死磕 Java 集合】— LinkedTransferQueue源码分析问题(1)LinkedTransferQueue是什么东东?(2)LinkedTransferQueue是怎么实现阻塞队列的?(3)LinkedTransferQueue是怎么控制并发安全的?(4)LinkedTransferQueue与SynchronousQueue有什么异同?简介LinkedTransferQueue是LinkedBlockingQueue、SynchronousQu...原创 2020-07-06 07:03:27 · 200 阅读 · 0 评论 -
【死磕 Java 集合】— PriorityBlockingQueue源码分析
【死磕 Java 集合】— PriorityBlockingQueue源码分析问题(1)PriorityBlockingQueue的实现方式?(2)PriorityBlockingQueue是否需要扩容?(3)PriorityBlockingQueue是怎么控制并发安全的?简介PriorityBlockingQueue是java并发包下的优先级阻塞队列,它是线程安全的,如果让你来实现你会怎么实现它呢?还记得我们前面介绍过的PriorityQueue吗?点击链接直...原创 2020-07-06 07:02:30 · 98 阅读 · 0 评论 -
【死磕 Java 集合】— SynchronousQueue源码分析
【死磕 Java 集合】— SynchronousQueue源码分析问题(1)SynchronousQueue的实现方式?(2)SynchronousQueue真的是无缓冲的吗?(3)SynchronousQueue在高并发情景下会有什么问题?简介SynchronousQueue是java并发包下无缓冲阻塞队列,它用来在两个线程之间移交元素,但是它有个很大的问题,你知道是什么吗?请看下面的分析。源码分析主要属性// CPU的数量static final i...原创 2020-07-06 07:01:32 · 146 阅读 · 0 评论 -
【死磕 Java 集合】— LinkedBlockingQueue源码分析
【死磕 Java 集合】— LinkedBlockingQueue源码分析问题(1)LinkedBlockingQueue的实现方式?(2)LinkedBlockingQueue是有界的还是无界的队列?(3)LinkedBlockingQueue相比ArrayBlockingQueue有什么改进?简介LinkedBlockingQueue是java并发包下一个以单链表实现的阻塞队列,它是线程安全的,至于它是不是有界的,请看下面的分析。源码分析主要属性/...原创 2020-07-06 07:00:37 · 125 阅读 · 0 评论 -
【死磕 Java 集合】— ArrayBlockingQueue源码分析
【死磕 Java 集合】— ArrayBlockingQueue源码分析问题(1)ArrayBlockingQueue的实现方式?(2)ArrayBlockingQueue是否需要扩容?(3)ArrayBlockingQueue有什么缺点?简介ArrayBlockingQueue是java并发包下一个以数组实现的阻塞队列,它是线程安全的,至于是否需要扩容,请看下面的分析。队列队列,是一种线性表,它的特点是先进先出,又叫FIFO,就像我们平常排队一样,先到先得...原创 2020-07-06 06:59:35 · 89 阅读 · 0 评论 -
【死磕 Java 集合】— PriorityQueue源码分析
【死磕 Java 集合】— PriorityQueue源码分析问题(1)什么是优先级队列?(2)怎么实现一个优先级队列?(3)PriorityQueue是线程安全的吗?(4)PriorityQueue就有序的吗?简介优先级队列,是0个或多个元素的集合,集合中的每个元素都有一个权重值,每次出队都弹出优先级最大或最小的元素。一般来说,优先级队列使用堆来实现。还记得堆的相关知识吗?链接直达【拜托,面试别再问我堆(排序)了!】。那么Java里面是如何通过“堆”这个...原创 2020-06-17 18:50:12 · 153 阅读 · 0 评论 -
【死磕 Java 集合】— ConcurrentSkipListSet源码分析
【死磕 Java 集合】— ConcurrentSkipListSet源码分析问题(1)ConcurrentSkipListSet的底层是ConcurrentSkipListMap吗?(2)ConcurrentSkipListSet是线程安全的吗?(3)ConcurrentSkipListSet是有序的吗?(4)ConcurrentSkipListSet和之前讲的Set有何不同?简介ConcurrentSkipListSet底层是通过ConcurrentNavigab...原创 2020-06-17 18:49:24 · 116 阅读 · 0 评论 -
【死磕 Java 集合】— CopyOnWriteArraySet源码分析
【死磕 Java 集合】— CopyOnWriteArraySet源码分析问题(1)CopyOnWriteArraySet是用Map实现的吗?(2)CopyOnWriteArraySet是有序的吗?(3)CopyOnWriteArraySet是并发安全的吗?(4)CopyOnWriteArraySet以何种方式保证元素不重复?(5)如何比较两个Set中的元素是否完全一致?简介CopyOnWriteArraySet底层是使用CopyOnWriteArrayList存...原创 2020-06-17 18:48:42 · 186 阅读 · 0 评论 -
【死磕 Java 集合】— TreeSet源码分析
【死磕 Java 集合】— TreeSet源码分析问题(1)TreeSet真的是使用TreeMap来存储元素的吗?(2)TreeSet是有序的吗?(3)TreeSet和LinkedHashSet有何不同?简介TreeSet底层是采用TreeMap实现的一种Set,所以它是有序的,同样也是非线程安全的。源码分析经过前面我们学习HashSet和LinkedHashSet,基本上已经掌握了Set实现的套路了。所以,也不废话了,直接上源码:package jav...原创 2020-06-17 18:47:59 · 168 阅读 · 0 评论 -
【死磕 Java 集合】— LinkedHashSet源码分析
【死磕 Java 集合】— LinkedHashSet源码分析问题(1)LinkedHashSet的底层使用什么存储元素?(2)LinkedHashSet与HashSet有什么不同?(3)LinkedHashSet是有序的吗?(4)LinkedHashSet支持按元素访问顺序排序吗?简介上一节我们说HashSet中的元素是无序的,那么有没有什么办法保证Set中的元素是有序的呢?答案是当然可以。我们今天的主角LinkedHashSet就有这个功能,它是怎么实现有...原创 2020-06-17 18:47:17 · 130 阅读 · 0 评论 -
【死磕 Java 集合】— HashSet源码分析
【死磕 Java 集合】— HashSet源码分析问题(1)集合(Collection)和集合(Set)有什么区别?(2)HashSet怎么保证添加元素不重复?(3)HashSet是否允许null元素?(4)HashSet是有序的吗?(5)HashSet是同步的吗?(6)什么是fail-fast?简介集合,这个概念有点模糊。广义上来讲,java中的集合是指java.util包下面的容器类,包括和Collection及Map相关的所有类。中义上来讲,我们...原创 2020-06-17 18:46:35 · 137 阅读 · 0 评论 -
【死磕 Java 集合】— ConcurrentSkipListMap源码分析
【死磕 Java 集合】— ConcurrentSkipListMap源码分析前情提要点击链接查看“跳表”详细介绍。拜托,面试别再问我跳表了!简介跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。存储结构跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。源码分析主要内部类内部类跟存储结构结合...原创 2020-06-17 18:45:35 · 126 阅读 · 0 评论 -
【死磕 Java 集合】— ConcurrentHashMap源码分析(三)
【死磕 Java 集合】— ConcurrentHashMap源码分析(三)删除元素删除元素跟添加元素一样,都是先找到元素所在的桶,然后采用分段锁的思想锁住整个桶,再进行操作。public V remove(Object key) { // 调用替换节点方法 return replaceNode(key, null, null);}final V replaceNode(Object key, V value, Object cv) { // 计算ha...原创 2020-06-17 18:44:20 · 264 阅读 · 0 评论 -
【死磕 Java 集合】— ConcurrentHashMap源码分析(二)
【死磕 Java 集合】— ConcurrentHashMap源码分析(二)初始化桶数组第一次放元素时,初始化桶数组。private final Node<K,V>[] initTable() { Node<K,V>[] tab; int sc; while ((tab = table) == null || tab.length == 0) { if ((sc = sizeCtl) < 0) /...原创 2020-06-17 18:43:29 · 108 阅读 · 0 评论 -
【死磕 Java 集合】— ConcurrentHashMap源码分析(一)
【死磕 Java 集合】— ConcurrentHashMap源码分析(一)开篇问题(1)ConcurrentHashMap与HashMap的数据结构是否一样?(2)HashMap在多线程环境下何时会出现并发安全问题?(3)ConcurrentHashMap是怎么解决并发安全问题的?(4)ConcurrentHashMap使用了哪些锁?(5)ConcurrentHashMap的扩容是怎么进行的?(6)ConcurrentHashMap是否是强一致性的?(7)Con...原创 2020-06-17 18:42:25 · 111 阅读 · 0 评论 -
【死磕 Java 集合】— TreeMap源码分析(四)
【死磕 Java 集合】— TreeMap源码分析(四)二叉树的遍历我们知道二叉查找树的遍历有前序遍历、中序遍历、后序遍历。(1)前序遍历,先遍历我,再遍历我的左子节点,最后遍历我的右子节点;(2)中序遍历,先遍历我的左子节点,再遍历我,最后遍历我的右子节点;(3)后序遍历,先遍历我的左子节点,再遍历我的右子节点,最后遍历我;这里的前中后都是以“我”的顺序为准的,我在前就是前序遍历,我在中就是中序遍历,我在后就是后序遍历。下面让我们看看经典的中序遍历是怎么实现的:pu...原创 2020-06-14 20:32:04 · 146 阅读 · 0 评论 -
【死磕 Java 集合】— TreeMap源码分析(三)
【死磕 Java 集合】— TreeMap源码分析(三)删除元素删除元素本身比较简单,就是采用二叉树的删除规则。(1)如果删除的位置有两个叶子节点,则从其右子树中取最小的元素放到删除的位置,然后把删除位置移到替代元素的位置,进入下一步。(2)如果删除的位置只有一个叶子节点(有可能是经过第一步转换后的删除位置),则把那个叶子节点作为替代元素,放到删除的位置,然后把这个叶子节点删除。(3)如果删除的位置没有叶子节点,则直接把这个删除位置的元素删除即可。(4)针对红黑树,如果删除位置...原创 2020-06-14 20:31:11 · 159 阅读 · 1 评论 -
【死磕 Java 集合】— TreeMap源码分析(二)
【死磕 Java 集合】— TreeMap源码分析(二)插入元素插入元素,如果元素在树中存在,则替换value;如果元素不存在,则插入到对应的位置,再平衡树。public V put(K key, V value) { Entry<K,V> t = root; if (t == null) { // 如果没有根节点,直接插入到根节点 compare(key, key); // type (and possibly null...原创 2020-06-14 20:28:50 · 126 阅读 · 0 评论 -
【死磕 Java 集合】— TreeMap源码分析(一)
简介TreeMap使用红黑树存储元素,可以保证元素按key值的大小进行遍历。继承体系TreeMap实现了Map、SortedMap、NavigableMap、Cloneable、Serializable等接口。SortedMap规定了元素可以按key的大小来遍历,它定义了一些返回部分map的方法。public interface SortedMap<K,V> extends Map<K,V> { // key的比较器 Compara...原创 2020-06-14 20:27:37 · 251 阅读 · 0 评论 -
【死磕 Java 集合】— WeakHashMap源码分析
简介WeakHashMap是一种弱引用map,内部的key会存储为弱引用,当jvm gc的时候,如果这些key没有强引用存在的话,会被gc回收掉,下一次当我们操作map的时候会把对应的Entry整个删除掉,基于这种特性,WeakHashMap特别适用于缓存处理。继承体系可见,WeakHashMap没有实现Clone和Serializable接口,所以不具有克隆和序列化的特性。存储结构WeakHashMap因为gc的时候会把没有强引用的key回收掉,所以注定了它里面的元素不会太多...原创 2020-06-14 20:25:59 · 148 阅读 · 0 评论 -
【死磕 Java 集合】— CopyOnWriteArrayList源码分析
简介CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过数组实现,每次对数组的修改都完全拷贝一份新的数组来修改,修改完了再替换掉老数组,这样保证了只阻塞写操作,不阻塞读操作,实现读写分离。继承体系CopyOnWriteArrayList实现了List, RandomAccess, Cloneable, java.io.Serializable等接口。CopyOnWriteArrayList实现了List,提供了基础的添加、删除、遍历等操作。C...原创 2020-06-14 20:24:42 · 140 阅读 · 0 评论 -
【死磕 Java 集合】— LinkedHashMap源码分析
简介LinkedHashMap内部维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用来实现LRU缓存策略。LinkedHashMap可以看成是 LinkedList + HashMap。继承体系LinkedHashMap继承HashMap,拥有HashMap的所有特性,并且额外增加的按一定顺序访问的特性。存储结构我们知道HashMap使用(数组 + 单链表 + 红黑树)的存储结构,那LinkedHashMap是怎么存储的呢?通过上面的继承体系...原创 2020-06-14 20:22:07 · 163 阅读 · 0 评论 -
【死磕 Java 集合】— HashMap源码分析
简介HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改的速度都很快,能达到O(1)的平均时间复杂度。它是非线程安全的,且不保证元素存储的顺序;继承体系HashMap实现了Cloneable,可以被克隆。HashMap实现了Serializable,可以被序列化。HashMap继承自AbstractMap,实现了Map接口,具有Map的所有功能。存储结构在Java中,HashMap的实现采用了(数组 + 链表 + 红黑树)的复杂结...原创 2020-06-14 20:21:06 · 222 阅读 · 0 评论 -
【死磕 Java 集合】— LinkedList源码分析
问题(1)LinkedList只是一个List吗?(2)LinkedList还有其它什么特性吗?(3)LinkedList为啥经常拿出来跟ArrayList比较?(4)我为什么把LinkedList放在最后一章来讲?简介LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用,它是怎么实现的呢?让我们一起来学习吧。继承体系通过继承体系,我们可以看到LinkedList不仅实现了List接口,还实现了Queue和Deque...原创 2020-06-14 20:20:01 · 104 阅读 · 0 评论 -
【死磕 Java 集合】— ArrayList源码分析
【死磕 Java 集合】— ArrayList源码分析简介ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组。继承体系ArrayList实现了List, RandomAccess, Cloneable, java.io.Serializable等接口。ArrayList实现了List,提供了基础的添加、删除、遍历等操作。ArrayList实现了RandomAccess,提供了随机访问的能力。ArrayList实现...原创 2020-06-14 20:18:45 · 129 阅读 · 0 评论