
JAVA集合源码分析
qq_39409110
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java集合源码分析之开篇
初衷Java集合是我们使用最频繁的工具,也是面试的热点,但我们对它的理解仅限于使用上,而且大多数情况没有考虑过其使用规范。本系列文章将跟随源码的思路,分析实现的每个细节,以期在使用时避免各种不规范的坑。在这里,我们会惊艳于开发者优秀的设计,也会感激先辈们付出的艰辛努力,更重要的是知其所以然,少犯错误,写出优秀的代码。许多人对集合类的理解是暴力的,当需要保存对象时就使用ArrayList,当...原创 2019-01-07 10:04:22 · 144 阅读 · 0 评论 -
Java集合源码分析之Map(二):接口SortedMap
由于乱序的数据对查找不利,例如无法使用二分法等降低算法的时间复杂度,如果数据在插入时就排好顺序,查找的性能就会提升很多。SortedMap接口就是为这种有序数据服务的。SortedMap接口需要数据的key支持Comparable,或者可以被指定的Comparator接受。SortedMap主要提供了以下方法:// 返回排序数据所用的ComparatorComparator<? ...原创 2019-01-12 17:47:56 · 195 阅读 · 0 评论 -
Java集合源码分析之Map(四):TreeMap
TreeMap是红黑树的java实现,对红黑树不太了解的可以查阅这篇文章Java集合源码分析之基础(六):红黑树(RB Tree)。红黑树能保证增、删、查等基本操作的时间复杂度为O(lgN)。本文将对TreeMap的源码进行分析。Entry定义static final class Entry<K,V> implements Map.Entry<K,V> { ...原创 2019-01-12 17:48:07 · 169 阅读 · 0 评论 -
Java集合源码分析之Map(五):HashMap
HashMap可能是我们使用最多的键值对型的集合类了,它的底层基于哈希表,采用数组存储数据,使用链表来解决哈希碰撞。在JDK1.8中还引入了红黑树来解决链表长度过长导致的查询速度下降问题。以下是文档对它的介绍中我们重点关注的部分:Hash table based implementation of the Map interface. This implementation provides...原创 2019-01-12 17:48:16 · 155 阅读 · 0 评论 -
Java集合源码分析之Set概述
这篇文章是本系列的完结了,也会是读起来最轻松的文章了。因为这里只有一个概念,那就是Set是什么,其余的则是一些感触与总结。Set概述因为Set的结构及实现都和Map保持高度一致,这里将不再对其进行分析了,感兴趣的朋友可以自行查看源码。但我们还是需要知道什么是Set,Set是一个包含不可重元素的集合,也就是所有的元素都是唯一的。还是看下文档说明吧:A collection that c...原创 2019-01-12 17:48:25 · 214 阅读 · 0 评论 -
Java集合源码分析之Iterable概述
前言当我们想要遍历集合时,Java为我们提供了多种选择,通常有以下三种写法:写法1:for循环for (int i = 0, len = strings.size(); i < len; i++) { System.out.println(strings.get(i));}写法2:foreach循环for (String var : strings) { ...原创 2019-01-12 17:48:35 · 215 阅读 · 0 评论 -
Java集合源码分析之基础(三):树与二叉树
数组和链表都是用来解决一对一问题的,而一对多问题则需要树来解决。这里,我们重点关注二叉排序树,所以只会介绍一些必需了解的概念,关于树的更多知识,大家可以查看相关书籍进行系统的学习。树的定义树(Tree)是n(n≥0) 个结点的有限集。n=0 时称为空树。在任意一棵非空树中:1. 有且仅有一个特定的称为根(Root)的结点;2. 当n>1 时,其余结点可分为m (m>0) 个...原创 2019-01-07 22:09:53 · 138 阅读 · 0 评论 -
Java集合源码分析之基础(四):二叉排序树
解决查询速度慢的方案除了哈希表外,还可以使用二叉排序树。我们知道,查询慢主要是因为不知道元素的位置,使用hash函数映射虽然解决了问题,但其并不稳定,当出现大量的哈希碰撞后其表现更像一个链表,查询速度大大降低。二叉排序树的方案则是使元素有序,这样便可以使用二分法进行查找了,虽然效率相比hash函数低一些,但可以通过AVL树、红黑树等增加稳定性。HashMap在JDK1.8的实现中,就结合了...原创 2019-01-07 22:10:07 · 177 阅读 · 0 评论 -
Java集合源码分析之基础(五):平衡二叉树(AVL Tree)
二叉排序树很好的平衡了插入与查找的效率,但不平衡的二叉排序树效率大打折扣。今天介绍的AVL树就是一种解决此问题的方案。定义平衡二叉树(Self-Balancing Binary Search Tree 或Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1 。它是一种高度平衡的二叉排序树。意思是说,要么它...原创 2019-01-07 22:10:17 · 153 阅读 · 0 评论 -
Java集合源码分析之Map(一):超级接口Map
数组与链表在处理数据时各有优缺点,数组查询速度很快而插入很慢,链表在插入时表现优秀但查询无力。哈希表则整合了数组与链表的优点,能在插入和查找等方面都有不错的速度。我们之后要分析的HashMap就是基于哈希表实现的,不过在JDK1.8中还引入了红黑树,其性能进一步提升了。本文主要分析JDK中关于Map的定义。接口MapMap的定义为:An object that maps keys t...原创 2019-01-12 17:47:35 · 149 阅读 · 0 评论 -
Java集合源码分析之LinkedList
分析完了List与Queue之后,终于可以看看LinkedList的实现了。LinkedList弥补了ArrayList增删较慢的问题,但在查找方面又逊色于ArrayList,所以在使用时需要根据场景灵活选择。对于这两个频繁使用的集合类,掌握它们的源码并正确使用,可以让我们的代码更高效。LinkedList既实现了List,又实现了Deque,前者使它能够像使用ArrayList一样使用,后者...原创 2019-01-11 17:53:55 · 159 阅读 · 0 评论 -
Java集合源码分析之基础(一):数组与链表
数组和链表是数据结构中最基本的部分,也是其余众多数据结构的基础。即使在Java中,这两种结构使用的也很普遍。这里我们会先对它们进行简要分析。数组在java中,数组定义为一种基本类型,其可以通过下标获取到对应位置的数据。那么这种结构的数据,在内存中是怎么存放的呢?正如上图所示,数组在内存中是一段连续的存储单元,每个数据依次放在每个单元中。分析这种结构,我们可以得出以下几个结论:...原创 2019-01-07 10:04:36 · 337 阅读 · 2 评论 -
Java集合源码分析之基础(二):哈希表
无论是数组还是链表,其对数据的查询表现都比较无力,要想知道一个元素是否在数组或链表中,只能从前向后挨个对比。出现这个问题的根源在于,我们没有办法直接根据一个元素找到它存储的位置,那有没有办法消除这个对比的过程呢?哈希表就是解决查询问题的一种方案。在后续将会分析的二叉排序树中,还会将数据排序以进行二分查找,将时间复杂度从O(n)降低到O(lg n)。哈希表与Hash函数通俗来讲,哈希表就...原创 2019-01-07 10:04:50 · 318 阅读 · 3 评论 -
Java集合源码分析之超级接口:Collection
CollectionCollection是List、Queue和Set的超集,它直接继承于Iterable,也就是所有的Collection集合类都支持for-each循环。除此之外,Collection也是面向接口编程的典范,通过它可以在多种实现类间转换,这也是面向对象编程的魅力之一。方法定义在阅读源码前,我们可以先自行想象一下,如果我们想封装下数组或链表以方便操作,我们需要封装哪些...原创 2019-01-11 17:52:53 · 195 阅读 · 0 评论 -
Java集合源码分析之List(一):超级接口List
List是Collection三大直接子接口之一,其中的数据可以通过位置检索,用户可以在指定位置插入数据。List的数据可以为空,可以重复。以下是其文档注释,只看前两段:An ordered collection (also known as a sequence). The user of this interface has precise control over where in t...原创 2019-01-11 17:53:06 · 428 阅读 · 0 评论 -
Java集合源码分析之List(二):ArrayList
做了这么多准备,终于到了ArrayList了,ArrayList是我们使用最为频繁的集合类了,我们先看看文档是如何介绍它的:Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, including null...原创 2019-01-11 17:53:18 · 210 阅读 · 0 评论 -
Java集合源码分析之Queue(一):超级接口Queue
在日常生活中,排队几乎随处可见,上地铁要排队,买火车票要排队,就连出门吃个大餐,也要排队。。。之前研究的ArrayList就像是一个缺乏管理的排队系统。大家虽然会排队,但一会走个人,大家向前挪一挪,一会插个人,大家向后挪一挪,碰到这样的队伍,一定让人痛苦万分吧?今天要介绍的Queue就不同了,它是一个严格的排队系统。就像许多火车站排队窗口在两侧加了护栏一样,大家只能从队尾进来,从队首离开,我们...原创 2019-01-11 17:53:28 · 158 阅读 · 0 评论 -
Java集合源码分析之Queue(二):接口Deque
Deque全称为double ended queue,即双向队列,它允许在两侧插入或删除元素,同时也建议我们不要向其中插入null值。除此之外,其余特性则和父级Queue类似。Deque大多数情况下不会限制元素的数量,但这不是必须的。Deque中定义的方法主要分为四部分,第一部分就如Deque定义所言,提供两侧插入或删除的方法。第二部分是继承自Queue的实现。第三部分表示如果要基于此实现一个...原创 2019-01-11 17:53:37 · 145 阅读 · 0 评论 -
Java集合源码分析之Queue(三):ArrayDeque
在介绍了Queue与Deque概念之后,这是要进行分析的第一个实现类。ArrayDeque可能大家用的都比较少,但其实现里有许多亮点还是值得我们关注的。Deque的定义为double ended queue,也就是允许在两侧进行插入和删除等操作的队列。这个定义看起来很简单,那么我们怎么实现它呢?我们最容易想到的就是使用双向链表。我们在前文介绍过单链表,其每个数据单元都包含一个数据元素和一个指向...原创 2019-01-11 17:53:47 · 269 阅读 · 0 评论 -
Java集合源码分析之基础(六):红黑树(RB Tree)
红黑树和AVL树的思想是类似的,都是在插入过程中对二叉排序树进行调整,从而提升性能,它的增删改查均可以在O(lg n)内完成。本文会从定义到实现一棵红黑树展开,还会简单介绍其与AVL树的异同。定义红黑树是一棵二叉排序树。且满足以下特点:每个节点或者是黑色,或者是红色。 根节点是黑色。 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!...原创 2019-01-07 22:10:28 · 174 阅读 · 0 评论