JAVA 集合
文章平均质量分 65
码到成功-
脚踏实地,一步一个脚印
展开
-
JAVA 集合专栏汇总
https://www.jianshu.com/p/407afb4a267a本文由作者授权发布。作者刚开始写这个系列的时候就给我微信投稿了,差点忘了...还好上周提醒了一下我,没想到作者早已完成了整个系列。大家日常都在写Android,可能很少会关注Java的一些源码,但是实际上要作为一名优秀的工程师,基础知识非常重要;再者现在面试大厂对于Java的提问占了相当的比重,其中Java集合这一块基本上...转载 2018-06-21 12:48:38 · 370 阅读 · 0 评论 -
Java集合源码分析之Queue(二):接口Deque
Deque全称为double ended queue,即双向队列,它允许在两侧插入或删除元素,同时也建议我们不要向其中插入null值。除此之外,其余特性则和父级Queue类似。Deque大多数情况下不会限制元素的数量,但这不是必须的。Deque中定义的方法主要分为四部分,第一部分就如Deque定义所言,提供两侧插入或删除的方法。第二部分是继承自Queue的实现。第三部分表示如果要基于此实现一个St...转载 2018-06-23 22:38:55 · 133 阅读 · 0 评论 -
Java集合源码分析之Queue(三):ArrayDeque
在介绍了Queue与Deque概念之后,这是要进行分析的第一个实现类。ArrayDeque可能大家用的都比较少,但其实现里有许多亮点还是值得我们关注的。Deque的定义为double ended queue,也就是允许在两侧进行插入和删除等操作的队列。这个定义看起来很简单,那么我们怎么实现它呢?我们最容易想到的就是使用双向链表。我们在前文介绍过单链表,其每个数据单元都包含一个数据元素和一个指向下一...转载 2018-06-23 22:40:35 · 224 阅读 · 0 评论 -
Java集合源码分析之Map(一):超级接口Map
数组与链表在处理数据时各有优缺点,数组查询速度很快而插入很慢,链表在插入时表现优秀但查询无力。哈希表则整合了数组与链表的优点,能在插入和查找等方面都有不错的速度。我们之后要分析的HashMap就是基于哈希表实现的,不过在JDK1.8中还引入了红黑树,其性能进一步提升了。本文主要分析JDK中关于Map的定义。接口MapMap的定义为:An object that maps keys to v...转载 2018-06-25 22:27:05 · 220 阅读 · 0 评论 -
Java集合源码分析之Map(二):接口SortedMap
由于乱序的数据对查找不利,例如无法使用二分法等降低算法的时间复杂度,如果数据在插入时就排好顺序,查找的性能就会提升很多。SortedMap接口就是为这种有序数据服务的。SortedMap接口需要数据的key支持Comparable,或者可以被指定的Comparator接受。SortedMap主要提供了以下方法:// 返回排序数据所用的ComparatorComparator<...转载 2018-06-25 22:28:09 · 327 阅读 · 0 评论 -
Java集合源码分析之Map(三):接口NavigableMap
SortedMap提供了获取最大值与最小值的方法,但对于一个已经排序的数据集,除了最大值与最小值之外,我们可以对任何一个元素,找到比它小的值和比它大的值,还可以按照按照原有的顺序倒序排序等。NavigableMap就为我们提供了这些功能。NavigableMap主要有以下方法:// 找到第一个比指定的key小的值Map.Entry<K,V> lowerEntry(K key);/...转载 2018-06-25 22:29:08 · 282 阅读 · 0 评论 -
Java集合源码分析之Map(四):TreeMap
TreeMap是红黑树的java实现,对红黑树不太了解的可以查阅这篇文章Java集合源码分析之基础(六):红黑树(RB Tree)。红黑树能保证增、删、查等基本操作的时间复杂度为O(lgN)。本文将对TreeMap的源码进行分析。TreeMap结构图Entry定义static final class Entry<K,V> implements Map.Entry<K,V>...转载 2018-06-25 22:30:08 · 164 阅读 · 0 评论 -
Java集合源码分析之Map(五):HashMap
HashMap可能是我们使用最多的键值对型的集合类了,它的底层基于哈希表,采用数组存储数据,使用链表来解决哈希碰撞。在JDK1.8中还引入了红黑树来解决链表长度过长导致的查询速度下降问题。以下是文档对它的介绍中我们重点关注的部分:Hash table based implementation of the Map interface. This implementation provides al...转载 2018-06-26 21:28:29 · 132 阅读 · 0 评论 -
Java集合源码分析之Map(六):LinkedHashMap
LinkedHashMap是HashMap的子类,所以也具备HashMap的诸多特性。不同的是,LinkedHashMap还维护了一个双向链表,以保证通过Iterator遍历时顺序与插入顺序一致。除此之外,它还支持Access Order,即按照元素被访问的顺序来排序,我们熟知的LRUCache底层就依赖于此。以下是文档中需要我们注意的点:Hash table and linked list im...转载 2018-06-26 21:29:57 · 179 阅读 · 0 评论 -
Java集合源码分析之Set概述
这篇文章是本系列的完结了,也会是读起来最轻松的文章了。因为这里只有一个概念,那就是Set是什么,其余的则是一些感触与总结。Set概述因为Set的结构及实现都和Map保持高度一致,这里将不再对其进行分析了,感兴趣的朋友可以自行查看源码。但我们还是需要知道什么是Set,Set是一个包含不可重元素的集合,也就是所有的元素都是唯一的。还是看下文档说明吧:A collection that contains...转载 2018-06-26 21:31:43 · 179 阅读 · 0 评论 -
Java集合源码分析之Queue(一):超级接口Queue
在日常生活中,排队几乎随处可见,上地铁要排队,买火车票要排队,就连出门吃个大餐,也要排队。。。之前研究的ArrayList就像是一个缺乏管理的排队系统。大家虽然会排队,但一会走个人,大家向前挪一挪,一会插个人,大家向后挪一挪,碰到这样的队伍,一定让人痛苦万分吧?今天要介绍的Queue就不同了,它是一个严格的排队系统。就像许多火车站排队窗口在两侧加了护栏一样,大家只能从队尾进来,从队首离开,我们称之...转载 2018-06-23 17:39:22 · 194 阅读 · 0 评论 -
Java集合源码分析之List(二):ArrayList
Java集合源码分析之List(二):ArrayList 大大纸飞机 关注2018.04.17 16:02* 字数 1952 阅读 427评论 5喜欢 2做了这么多准备,终于到了ArrayList了,ArrayList是我们使用最为频繁的集合类了,我们先看看文档是如何介绍它的:Resizable-array implementation of the List interface. Impleme...转载 2018-06-23 17:37:37 · 190 阅读 · 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 the ...转载 2018-06-23 17:36:35 · 247 阅读 · 0 评论 -
Java集合源码分析之基础(一):数组与链表
数组和链表是数据结构中最基本的部分,也是其余众多数据结构的基础。即使在Java中,这两种结构使用的也很普遍。这里我们会先对它们进行简要分析。数组在java中,数组定义为一种基本类型,其可以通过下标获取到对应位置的数据。那么这种结构的数据,在内存中是怎么存放的呢?数组的结构示意图正如上图所示,数组在内存中是一段连续的存储单元,每个数据依次放在每个单元中。分析这种结构,我们可以得出以下几个结论:创建一...转载 2018-06-21 22:17:42 · 114 阅读 · 0 评论 -
Java集合源码分析之基础(二):哈希表
无论是数组还是链表,其对数据的查询表现都比较无力,要想知道一个元素是否在数组或链表中,只能从前向后挨个对比。在后续将会分析的二叉排序树中,还会将数据排序以进行二分查找,将时间复杂度从O(n)降低到O(lg n)。出现这个问题的根源在于,我们没有办法直接根据一个元素找到它存储的位置,那有没有办法消除这个对比的过程呢?哈希表就是解决查询问题的一种方案。什么是哈希表与Hash函数通俗来讲,哈希表...转载 2018-06-21 22:20:01 · 96 阅读 · 0 评论 -
Java集合源码分析之基础(三):树与二叉树
数组和链表都是用来解决一对一问题的,而一对多问题则需要树来解决。这里,我们重点关注二叉排序树,所以只会介绍一些必需了解的概念,关于树的更多知识,大家可以查看相关书籍进行系统的学习。树的定义树(Tree)是n(n≥0) 个结点的有限集。n=0 时称为空树。在任意一棵非空树中:1. 有且仅有一个特定的称为根(Root)的结点;2. 当n>1 时,其余结点可分为m (m>0) 个互不相交的有...转载 2018-06-21 22:23:25 · 243 阅读 · 0 评论 -
Java集合源码分析之基础(四):二叉排序树
解决查询速度慢的方案除了哈希表外,还可以使用二叉排序树。我们知道,查询慢主要是因为不知道元素的位置,使用hash函数映射虽然解决了问题,但其并不稳定,当出现大量的哈希碰撞后其表现更像一个链表,查询速度大大降低。二叉排序树的方案则是使元素有序,这样便可以使用二分法进行查找了,虽然效率相比hash函数低一些,但可以通过AVL树、红黑树等增加稳定性。HashMap在JDK1.8的实现中,就结合了哈希表的...转载 2018-06-21 22:25:20 · 167 阅读 · 0 评论 -
Java集合源码分析之基础(五):平衡二叉树(AVL Tree)
二叉排序树很好的平衡了插入与查找的效率,但不平衡的二叉排序树效率大打折扣。今天介绍的AVL树就是一种解决此问题的方案。定义平衡二叉树(Self-Balancing Binary Search Tree 或Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1 。它是一种高度平衡的二叉排序树。意思是说,要么它是一棵空...转载 2018-06-21 22:26:55 · 188 阅读 · 0 评论 -
Java集合源码分析之基础(六):红黑树(RB Tree)
红黑树和AVL树的思想是类似的,都是在插入过程中对二叉排序树进行调整,从而提升性能,它的增删改查均可以在O(lg n)内完成。本文会从定义到实现一棵红黑树展开,还会简单介绍其与AVL树的异同。定义红黑树是一棵二叉排序树。且满足以下特点:每个节点或者是黑色,或者是红色。根节点是黑色。每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]如果一...转载 2018-06-22 19:06:02 · 249 阅读 · 0 评论 -
RandomAccess接口理解
根据javadoc上面的的解释是:RandomAccess 是一个标记接口,用于标明实现该接口的List支持快速随机访问,主要目的是使算法能够在随机和顺序访问的list中表现的更加高效。我们可以简单的看下Collections下的binarySearch方法的源码:public static <T> int binarySearch(List<? extends T> li...原创 2018-06-23 12:30:07 · 168 阅读 · 0 评论 -
JAVA 阻塞队列 BlockingQueue
BlockingQueue前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,...转载 2018-06-23 17:28:10 · 154 阅读 · 0 评论 -
Java集合源码分析之Iterable概述
Iterable是迭代器的意思,作用是为集合类提供for-each循环的支持。由于使用for循环需要通过位置获取元素,而这种获取方式仅有数组支持,其他许多数据结构,比如链表,只能通过查询获取数据,这会大大的降低效率。Iterable就可以让不同的集合类自己提供遍历的最佳方式。Iterable的文档声明仅有一句:Implementing this interface allows an object...转载 2018-06-23 17:33:01 · 364 阅读 · 0 评论 -
Java集合源码分析之超级接口:Collection
Collection是List、Queue和Set的超集,它直接继承于Iterable,也就是所有的Collection集合类都支持for-each循环。除此之外,Collection也是面向接口编程的典范,通过它可以在多种实现类间转换,这也是面向对象编程的魅力之一。方法定义在阅读源码前,我们可以先自行想象一下,如果我们想封装下数组或链表以方便操作,我们需要封装哪些功能呢?比如:统计大小、插入或删...转载 2018-06-23 17:34:56 · 718 阅读 · 0 评论 -
线程不安全的HashMap、线程安全的ConcurrentHashMap
线程不安全的HashMap 在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。例如,执行如下代码会引起死循环。 HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环...转载 2018-07-25 16:09:59 · 1015 阅读 · 0 评论