![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java集合源码
文章平均质量分 78
不会编程的派大星
Keep Coding!!!
展开
-
Java集合源码分析(十六):LinkedHashMap
LinkedHashMap是HashMap的子类,所以也具备HashMap的诸多特性。不同的是,LinkedHashMap还维护了一个双向链表,以保证通过Iterator遍历时顺序与插入顺序一致。除此之外,它还支持Access Order,即按照元素被访问的顺序来排序,我们熟知的LRUCache底层就依赖于此。一、成员变量先来看看存储元素的结构吧:static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K原创 2021-05-24 14:53:20 · 178 阅读 · 0 评论 -
Java集合源码分析(十五):HashMap(1.7版本和1.8版本)
HashMap集合是Map这个接口下的实现类中最为常用的一种,也是面试中经常会被问到的问题之一。由于HashMap用到的数据结构较为复杂,与其相关的问题通常不好回答,尤其是在jdk1.8之后,又引入了红黑树结构,其数据结构变得更加复杂,接下来我们就以1.8版本为例,对HashMap进行一波分析,在进行1.8版本之前,我们先来看看1.7版本的,有哪些不足和问题,为什么会在1.8引进红黑树这个结构等等问题。—JAVA JDK 1.7 版本HashMap—JDk1.7版本HashMap中的哈希表实现是数组+链原创 2021-05-23 21:14:44 · 328 阅读 · 3 评论 -
Java集合源码分析(十四):TreeMap
TreeMap是红黑树Java版的实现。如果还有小伙伴对红黑树还不是很了解的话,可以去之前的文章看一看。红黑树能保证对增删改查等基本操作的时间复杂度保持在O(lgN).接下来就让我们一起来看看TreeMap的底层源码。一、TreeMap继承结构从图中我们可以看到,TreeMap继承了父类AbstractMap类,也实现了Cloneable、NavigableMap还有Serializable接口。这几个接口分别能带来什么这里就不一 一说明了。二、Entry类static final class E原创 2021-05-20 17:02:17 · 1020 阅读 · 8 评论 -
Java集合源码分析(十三):sortedMap和NavigableMap
由于乱序的数据对查找不利,例如无法使用二分法等降低算法的时间复杂度,如果数据在插入时就排好序,查找的性能聚会提升很多。sortedMap接口就是为这种有序的数据服务的。一、sortedMap接口sortedMap接口需要数据的key支持Comparable,或者可以被指定的Comparator接受。sortedMap主要提供了以下方法:// 返回排序数据所用的ComparatorComparator<? super K> comparator();// 返回在[fromKey, to原创 2021-05-17 22:27:19 · 271 阅读 · 1 评论 -
Java集合源码分析(十二):超级接口Map
我们在前面说到的无论是链表还是数组,都有自己的优缺点,数组查询速度很快而插入很慢,链表在插入时表现优秀但查询无力。哈希表则整合了数组与链表的优点,能在插入和查找等方面都有不错的速度。我们之后要分析的HashMap就是基于哈希表实现的,不过在JDK1.8中还引入了红黑树,其性能进一步提升了。今天我们来说一说超级接口Map。一、接口MapMap是基于Key-Value的数据格式,并且key值不能重复,每个key对应的value值唯一。Map的key也可以为null,但不可重复。在看Map接口的方法前,我原创 2021-05-17 22:10:38 · 365 阅读 · 8 评论 -
Java集合源码分析(十一):LinkedList
首先我们知道,LinkedList的底层实现是一个双向链表,链表与数组的差别我们更是清楚,所以LinkedList弥补了ArrayList增删较慢和效率较低的问题了,但是在改和查方面有逊色于ArrayList,所以在使用时要根据业务场景灵活选择。对于这两个使用最频繁的集合类,掌握他们的源码并正确使用,可以让我们的代码更高效。步入主题,LinkedList既实现了List,又实现了Deque接口,前者使它能够像使用ArrayList一样使用,后者又使它能够承担队列的职责。LinkedList内部结构是一个双原创 2021-05-17 11:24:15 · 893 阅读 · 10 评论 -
Java集合源码分析(十):ArrayList
前面做了这么多准备,终于开始了哈,ArrayList开淦!ArrayList应该是我们使用最频繁的集合类了吧,我们先来看看文档是怎么介绍它的。我们可以知道,ArrayList其实就是Vector的翻版,只是去除了线程安全。ArrayList是一个可以动态调整大小的List实现,其数据的顺序与 插入顺序始终一致,其余特性与List一致。一、ArrayList继承结构从结构图中可以看到,ArrayList是AbstractList的子类,同时实现了List接口。除此之外,它还实现了三个标识型接口,这几原创 2021-05-16 15:14:31 · 180 阅读 · 2 评论 -
Java集合源码分析(九):超级接口List
List接口是Collection接口的三大接口之一,其中的数据可以通过位置检索,用户可以在指定位置插入数据。List的数据可以为空,可以重复。我们来看看api文档是怎么说的:一、List特有的方法我们这里就只关注和Collection不同的方法,主要有以下这些://在指定位置,将指定的集合插入到当前的集合中boolean addAll(int index, Collection<? extends E> c);//这是一个默认实现的方法,会通过Iterator的方式对每个元素进行原创 2021-05-12 21:07:04 · 245 阅读 · 5 评论 -
Java集合源码分析(八):超级接口Collection
Collection是List、Queue和set的超集,它直接继承于Iterable,也就是说所有的Collection集合类都支持foreach循环。除此之外呢,Collection也是面向接口编程的典范,它可以在多种实现类间转换,这就是面向对象编程的厉害之处!一、方法定义我们先想一想,公司如果要我们自己去封装一些操作数组或者链表的工具类,我么需要封装哪些功能呢?不妨就是统计其 大小,增删改查、清空或者是查看否含有某条数据等等。而collection接口就是把这些通常操作提取出来,使其更全面、更通原创 2021-05-12 10:42:00 · 166 阅读 · 6 评论 -
Java集合源码分析(七):Iterable接口
遍历集合我相信大部分coder都会遇到,也经常使用,而Java给我们提供了多种选择,接下来就让我们一起来看看吧!这里我们给定一个集合strings写法1–循环for (int i = 0, len = strings.size(); i < len; i++) { System.out.println(strings.get(i));}写法2–foreach循环for (String var : strings) { System.out.println(var);}原创 2021-05-10 10:25:37 · 279 阅读 · 1 评论 -
Java集合源码分析(六):红黑树(RB Tree)
红黑树和平衡二叉树的构建思想是类似的,都是在插入过程中对二叉排序树进行调整,从而提升性能,它的增删改查均可以在O(lg N)内完成。一、红黑树的定义红黑树是一颗二叉排序树,除了具有二叉排序树的特点与性之外,还具有以下的一些性质:1、 每个节点要么是黑色要么是红色2、 根节点是黑色3、 每个叶节点(NIL)是黑色(这里说的叶节点是指为空的叶子结点)4、 如果一个节点时红色的,则它的两个儿子都是黑色的5、 从一个节点到该节点的子孙节点的所有路劲上包含相同数目的黑节点红黑树示例:每个节点的最后原创 2021-05-09 21:24:12 · 570 阅读 · 2 评论 -
Java集合源码分析(五):平衡二叉树(AVL Tree)
在上一章的文章中,我们讲到了二叉排序树,它很好的平衡了插入与查找的效率,但二叉排序树如果不平衡,那么查找效率就会大大降低,今天要讲的这个平衡二叉树就是一种解决这个问题的方法。一、平衡二叉树的定义平衡二叉树 是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1 。它是一种高度平衡的二叉排序树。意思是说,要么它是一棵空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1 。我们将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF (Balance Fac原创 2021-05-08 22:33:17 · 228 阅读 · 1 评论 -
Java集合源码分析(四):二叉排序树
解决查询速度慢的方案除了哈希表外,还可以使用二叉排序树。我们知道,查询慢主要是因为不知道元素的位置,使用hash函数映射虽然解决了问题,但其并不稳定,当出现大量的哈希碰撞后其表现更像一个链表,查询速度大大降低。二叉排序树的方案则是使元素有序,这样便可以使用二分法进行查找了,虽然效率相比hash函数低一些,但可以通过AVL树、红黑树等增加稳定性。HashMap在JDK1.8的实现中,就结合了哈希表的高效和红黑树的稳定,我们之后会详细分析其实现。一、二叉排序树的定义二叉排序树 又称为二叉搜索树,它可以是原创 2021-05-08 20:49:41 · 140 阅读 · 1 评论 -
Java集合源码分析(三):树与二叉树
数组和链表都是用来解决一对一的问题的,而一对多问题则就需要树来解决。这里是为了后续的集合类相关来讲一些基础和概念,如果小伙伴们想更深一步了解的话,可以自己去翻阅相关资料。首先来看看树的定义吧一、树的定义树是N(N>0)个节点的有限集,当N=0是,该树称为空树。在任意一个非空树中:1. 有且仅有一个特定的称为根的节点,即根节点。2. 当N>1时,其余节点可分为M(M>0)个互不相交的有限集T1、T2、T3、…Tm,其中每一个集合本身又是一棵树,并且称为根的子树。图示:注:子原创 2021-05-08 20:36:23 · 142 阅读 · 1 评论 -
Java集合源码分析(二):哈希表
在Java集合源码分析(一):数组和链表的讨论中,我们知道数组和链表在查询方面都表现得很吃力,想要知道一个元素是否在数组中,只能一个一个去遍历对比。这个问题的根源就在于我们没有办法根据一个元素去找到他的存储地址,那又没有办法或者技术可以解决这个问题呢?当然有!哈希表就是解决查询问题的一种方案。在后续将会分析的二叉排序树中,还会将数据排序以进行二分查找,将时间复杂度从O(n)降低到O(lg n)。一、哈希表和哈希函数简单的来讲,哈希表就是通过关键字来获取数据的一种数据结构,它通过把关键字映射为表中的位置原创 2021-05-08 11:41:31 · 163 阅读 · 1 评论 -
java集合源码分析(一):数组与链表
数组和链表是数据结构中最基本的部分,也是众多数据结构的基础。在Java中这两种结构的使用也很广泛。今天就让我们来进行简要分析。一、数组在Java中,数组是被定为一种基本类型,其可以通过下标获取到对应位置的数据。那么这边结构在内存中是怎么存放的呢?正如上图所示,数组在内存中是一段连续的存储单元,每个数据依次放在每个单元中。分析这种结构,我们可以得出以下几个结论:1. 创建一个数组,必须声明其长度,这样在内存中可以寻找合适的一段连续存储单元,也就是数组的大小是固定的,我们无法动态调整其大小。2.原创 2021-05-08 10:27:27 · 130 阅读 · 1 评论