java集合类源码分析
人类一思考
雄关漫道真如铁,而今迈步从头越。
展开
-
源码解析——ArrayList
对于Collection集合类,网上常见的结构图如下:上图显示了常用的几个集合工具类的相互关系和结构组成,但实际上远没有那么简单,因此我从ArrayList开始,深入底层源码,慢慢将集合工具类的大体框架和具体实现梳理出来,帮助自己深入理解集合工具类。首先ArrayList作为List家族的一员,首先来梳理一下List家族的具体结构组成:所以作为我们最常用的ArrayL...原创 2019-04-13 15:42:51 · 186 阅读 · 0 评论 -
源码分析——TreeSet
TreeSet作为Set接口实现类中的最后一个,它的原理其实也和HashSet、LinkedHashSet差不多,它主要是建立在TreeMap之上。先继续熟悉它所处的结构体系:从上图可以看出TreeSet和HashSet属于同一层级,唯一的区别是它可以对容器内的元素进行一定规则的排序。继续看其继承体系:TreeSet与HashSet继承自同一个抽象类,即Abstract类...原创 2019-05-03 21:26:55 · 277 阅读 · 0 评论 -
源码分析——LinkedHashSet
LinkedHashSet对于HashSet就如LinkedHashMap对于HashMap一样,因此也很容易理解。首先,继续看一看它所处的体系结构:由于HashSet是无序的,因此LinkedHashSet主要的特点是让自己的元素保持一定的顺序。继续看它的继承体系:LinkedHashSet继承自HashSet,并实现了HashSet一样的接口,至于这些接口的方法也就不赘...原创 2019-05-03 20:35:50 · 192 阅读 · 0 评论 -
源码分析——HashSet
Set集合类型虽然是属于Collection集合体系中的,但是其实现类都是使用Map集合体系中的实现类实现的。至于如何实现我们继续开始研究。首先,再次亮出集合家族图谱:从中可以看到Set接口下面有三个实现类,分别是:HashSet、TreeSet、LinkedHashSet,乍一看感觉和Map接口下的三个实现类:HashMap、TreeMap、LinkedHashMap有异曲同工之妙,...原创 2019-05-03 20:04:34 · 172 阅读 · 0 评论 -
源码分析——TreeMap
TreeMap同样属于Map集合中的一员,但是它没有用到散列表和链表这些数据结构,它只使用了红黑树这一数据结构,可以直接在红黑树中进行增删改查操作。我们首先回顾一下Map集合的家族成员:可以看出TreeMap是和HashMap并列的,而HashMap中的键值对是无序的,TreeMap中的键值对是按照一定的顺序进行排序的。接下来继续看其继承结构:public class Tre...原创 2019-05-03 17:37:34 · 147 阅读 · 0 评论 -
源码分析——Hashtable
对于Hashtable,其实实际中用的不多,但是作为一个面试常考点,还是试着来研究一下这个集合类。首先研究Hashtable,就要将Hashtable和HashMap放在一起比较,因为两者的功能类似且相近。Hashtable产生于JDK1.1,而HashMap产生于JDK1.2,HashMap产生的时间要比Hashtable晚。接下来我们来看一看Hashtable的继承体系:其实通过对...原创 2019-05-03 16:02:37 · 197 阅读 · 0 评论 -
源码分析——LinkedHashMap
理解了HashMap就可以很容易理解LinkedHashMap了,首先来看一下LinkedHashMap所处的体系结构:从上面可以看出LinkedHashMap处于Map接口中,作为HashMap的一个子类,其继承了HashMap的方法,并且比它多了一项特性,也就是可以保证输入的顺序和输出的顺序是一样的。接下来继续看其如何实现:public class LinkedHashMap&l...原创 2019-05-03 14:04:13 · 199 阅读 · 0 评论 -
源码分析——HashMap(四)
前面三篇都是给本篇作辅助用的,现在正式来了解一下HashMap这个集合容器,首先拿出集合接口图谱:由上面的图谱可知HashMap是属于Map接口下的,和Set与List接口属于两个体系,再来看看它所在的家族图谱:从上图可以看出,HashMap继承自AbstractMap类并主要实现了Map接口,然而有一个地方很奇怪,既然AbstractMap已经实现了Map接口,为什么HashMa...原创 2019-04-22 17:23:35 · 214 阅读 · 0 评论 -
源码分析——LinkedList
继续分析List的整体框架结构:从上图可以看出,LinkedList与ArrayList和Vector不同,它直接继承的父类是AbstractSequentialList而不是AbstractList。 我们再来看一看它的体系结构:public class LinkedList<E> extends AbstractSequentialList<E> im...原创 2019-04-14 17:20:29 · 118 阅读 · 0 评论 -
源码分析——HashMap(三)
上一篇我们已经很详细的介绍了红黑树的具体结构以及插入和删除操作了,那么红黑树在HashMap中是如何具体实现的呢?首先我们来熟悉一下里面对左旋和右旋操作的实现,毕竟这两个操作在插入和删除里面是最基本的操作。首先来看左旋:p-->25,r-->35,pp->50static <K,V> TreeNode<K,V> rotateLeft(Tr...原创 2019-04-21 17:39:29 · 198 阅读 · 0 评论 -
源码分析——Vector
首先我们再来回顾一下List集合框架的具体体现:从中可以看出,Vector容器是和ArrayList最相似的集合类容器,其父类都是AbstractList类,那Vector到底有什么用?为什么有了ArrayList还要创一个Vector容器呢?那就从源码开始慢慢解读吧。首先看一看Vector类的结构:public class Vector<E> extends Ab...原创 2019-04-13 22:26:23 · 198 阅读 · 0 评论 -
源码分析——HashMap(二)
红黑树本篇主要介绍红黑树的基本概念以及相关的基本操作,并且讲解在HashMap中的主要实现。首先,红黑树是一种自平衡二叉查找树,它由AVL树与2-3树演化而来,它与AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的的查找性能,虽然操作比较复杂,但是它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:可以在O(log n)时间内做查找,删除与插入操...原创 2019-04-21 00:52:54 · 167 阅读 · 0 评论 -
源码分析——HashMap(一)
哈希表对于HashMap,我们首先来分析一下它的底层结构到底是怎么样的,众所周知,HashMap是用来存放键值对的,所谓键值对,也就是一个键对应一个值,HashMap中将一个键值对作为一个对象存放在容器中。而且HashMap中允许key值为null,也允许value值为null,表面上允许key值重复,但是当key值的hash值,本身值以及内存地址hash值一样的话,后一个键值对就会覆盖前一个...原创 2019-04-20 14:51:10 · 132 阅读 · 0 评论