Java集合类源码分析 〇、说明 一、Object类 1. 继承结构 2. 构造方法 3. 常用方法和参数 5. native关键字 二、ArrayList类 0. 数据结构 1. 继承结构 2....常用方法和参数 〇、说明 集合类特性 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。...如果要用线程安全的集合类,首选Concurrent并发包下的对应的集合类。 如何看源码 (1)看继承结构 看这个类的层次结构,处于一个什么位置,可以在自己心里有个大概的了解。...(3)看常用的方法 跟构造方法一样,这个方法实现功能是如何实现的 我的Java集合类博客 参考博客/有Nginx ---- 一、Object类 1....2.)如果转化为数组,只需要遍历集合toArray(),而遍历集合过程中不需要额外的操作,所以占用的时间相对是较短的,这样就利于其他线程尽快的使用这个集合。
RandmoAccess是java中用来被List实现的, 为List提供快速访问功能的. 在ArrayList中, 可以通过元素的序号快速获取元素对象, 这就是快速随机访问....ArrayList实现java.io.Serizlizable接口, 这意味着ArrayList支持序列化, 能通过序列化去传输. 1.ArrayLIst底层用数组实现 ? 其他字段: ?
HashSet是基于HashMap来实现的, 底层采用HashMap的key来保存数据, 借此实现元素不重复, 因此HashSet的实现比较简单, 基本上的都是...
源码可以说是十分简单了. 此类维护了元素的插入顺序.
点击“蓝字”关注我们吧 前言 该文章是基于JDK1.8版本进行集合源码分析的,工具使用的是IDEA哈。...ArrayList集合源码分析 首先看看ArrayList的结构图 分析结构 为什么要先继承AbstractList,而让AbstractList先实现List?...extends E> c)源码分析 public boolean addAll(Collection c)源码分析 public boolean removeAll(Collection c, boolean complement)源码分析 //该方法用于其他两个方法中,一个removeAll():它只清楚指定集合中的元素,retainAll()用来测试两个集合是否有交集。
前言 在前面的学习集合中只是介绍了集合的相关用法,我们想要更深入的去了解集合那就要通过我们去分析它的源码来了解它。希望对集合有一个更进一步的理解! 既然是看源码那我们要怎么看一个类的源码呢?...3)看常用的方法 跟构造方法一样,这个方法实现功能是如何实现的 注:既然是源码,为什么要这样设计类,有这样的继承关系。这就要说到设计模式的问题了。...1.2、ArrayList的数据结构 分析一个类的时候,数据结构往往是它的灵魂所在,理解底层的数据结构其实就理解了该类的实现思路,具体的实现细节再具体分析。 ...二、ArrayList源码分析 2.1、继承结构和层次关系 ? ? ...public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable
方法与ArrayList大体一致, 只是加上 synchronized 关键字, 保证线程安全, 下面就不具体分析源码了, 具体可以查看ArrayList中的源码分析....Vector源码分析 1.主要字段 ? 2.构造函数 ? ? 3.增删改查 ? 其他方法大部分类似, 不再赘述, 下面看下扩容机制的函数: ? ?...Vector可以设置, 默认2倍 ArrayList无参构造函数中初始量为0; Vector的无参构造函数初始容量为10 Vector与Collections.synchronizedList Vector是java.util...SynchronizedList是java.util.Collections中的一个静态内部类。...那么,到底SynchronizedList和Vector有没有区别,为什么java api要提供这两种线程安全的List的实现方式呢? 以下看 synchronizedList 部分源码: ? ?
CopyOnWriteArrayList实现了List, RandomAccess, Cloneable, java.io.Serializable等接口。...源码解析 属性 /** 用于修改时加锁 */final transient ReentrantLock lock = new ReentrantLock(); /** 真正存储元素的地方,只能通过getArray...// 这里c.toArray()返回的不一定是Object[]类型 // 详细原因见ArrayList里面的分析 if (elements.getClass() !...因为每次修改都是拷贝一份正好可以存储目标个数元素的数组,所以不需要size属性了,数组的长度就是集合的大小,而不像ArrayList数组的长度实际是要大于集合的大小的。...推荐阅读: 并发编程:LinkedBlockingQueue源码浅析 ArrayBlockingQueue源码分析 HashMap常见面试问题 HashMap的线程安全问题
前言 前面一篇我们分析了ArrayList的源码,这一篇分享的是LinkedList。我们都知道它的底层是由链表实现的,所以我们要明白什么是链表?...LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。 LinkedList 是非同步的。...是顺序存储结构(注意和随机存取结构两个概念搞清楚) 二、LinkedList源码分析 2.1、LinkedList的继承结构以及层次关系 ?...addAll()中的一个问题: 在addAll函数中,传入一个集合参数和插入位置,然后将集合转化为数组,然后再遍历数组,挨个添加数组的元素,但是问题来了,为什么要先转化为数组再进行遍历,而不是直接遍历集合呢...如果直接遍历集合的话,那么在遍历过程中需要插入元素,在堆上分配内存空间,修改指针域,这个过程中就会一直占用着这个集合,考虑正确同步的话,其他线程只能一直等待。 2.
LinkedHashMap重写了 HashMap 的Entry元素, 该Entry额外保存了上一个元素与下一个元素的引用, 从而在哈希表的基础上又构成了双向链表, 源码: ?
目录 Java 集合源码分析(一)HashMap 1. 概要 2. JDK 7 的 HashMap 3. JDK 1.8 的 HashMap 4. Hashtable 5....,不过趁自己刚好工作不太忙,有空闲期,静下心来研究学习源码也是一件很值得做的事,自己尽量会把这个坑填完?。 Java 集合源码分析(一)HashMap 1....概要 HashMap 作为我们经常使用的 Java 集合工具类,无论是学习研究,帮助自己更上一层楼,还是职场面试等方面,都有理由去深入研究。...null && key.equals(k)))) return e; } return null; } 2.5 两个问题 在讲解这两个问题前,补充一个知识点: java...最后补充一下 HashMap 中的一些属性和方法 由于属性和方法太多,我将一些属性和方法的注释上传到 GitHub 了,欢迎查看: GitHub源码
Hashtable也是基于哈希表实现的, 与map相似, 不过Hashtable是线程安全的, Hashtable不允许 key或value为null.
以下源码均为jdk1.7 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现. 提供所有可选的映射操作, 并允许使用null值和null健. 此类不保证映射的顺序....再来看 inflateTable()方法源码: ? 重量级角色, 哈希函数出场: ? indexFor()函数实现如下: ?...然后是getEntry()源码: ?
前言: 既然是看源码那我们要怎么看一个类的源码呢?这里我推荐的方法是: 1)看继承结构 看这个类的层次结构,处于一个什么位置,可以在自己心里有个大概的了解。...3)看常用的方法 跟构造方法一样,这个方法实现功能是如何实现的 注:既然是源码,为什么要这样设计类,有这样的继承关系。这就要说到设计模式的问题了。...ArrayList的数据结构 分析一个类的时候,数据结构往往是它的灵魂所在,理解底层的数据结构其实就理解了该类的实现思路,具体的实现细节再具体分析。 ArrayList的数据结构是: ?...二、ArrayList源码分析 2.1、继承结构和层次关系 ?...public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable
ArrayList ArrayList是最最常用的集合类了,真的没有之一。下面的分析是基于1.8.0_261源码进行分析的。...这个需要我们看源码里面的readOject()和writeOject()两个方法。其实就除了默认的序列化其他字段,这个elementData字段,还需要手动序列化和反序列化。...private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{ //...构造方法 构造方法有三个,可以指定容量,可以指定初始的元素集合,也可以什么都不指定。...迭代器 源码中一共定义了三个迭代器: Itr:实现了Iterator接口,是AbstractList.Itr的优化版本。
LinkedList源码分析 1.数据结构 LinkedList是基于链表结构实现的, 在类中定义了头尾指针. 其内部维护了一个双向链表 ? ? 2.构造方法 默认构造函数很简单, 啥也没有 ?...将集合的元素添加的LinkedList中: ? ? ? 3.存储 (1)add(E)在链表的末尾添加元素 ? ? (2)add(int, E)在指定的位置插入元素 ? ? ?...(3)addAll(Collection)将集合添加到链表末尾, 该方法在构造方法中介绍了, 在此不再赘述 ?...(4)addAll(int, Collection)将集合添加到链表的指定位置, 该方法也在构造方法中介绍了 ? (5)addFirst(E)将元素添加到链表表头位置 ? ?...5.删除 删除方法不在给出源码, 基本大同小异.
Java中默认初始容量为16,加载因子为0.75。...int threshold; 我们通过一张HashMap的数据结构图来分析: ?...二、HashMap的源码分析(一) 2.1、HashMap的层次关系与继承结构 1)HashMap继承结构 ? ...= e.getValue(); putVal(hash(key), key, value, false, evict); } } } 三、HashMap源码分析...2)通过源码的学习,hashMap是一个能快速通过key获取到value值得一个集合,原因是内部使用的是hash查找值得方法。
前言 前面一篇我们分析了ArrayList的源码,这一篇分享的是LinkedList。我们都知道它的底层是由链表实现的,所以我们要明白什么是链表?...LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。 LinkedList 是非同步的。...3)是顺序存取结构(注意和随机存取结构两个概念搞清楚) 二、LinkedList源码分析 2.1、LinkedList的继承结构以及层次关系 ? ...实现接口分析: ? ...这个Node看下面一步的源码分析,Node就是linkedList的最核心的实现,可以直接先跳下一个去看Node的分析 Node pred, succ; //构造方法中传过来的就是
以脑图的形式来展示Java集合知识,让零碎知识点形成体系 Iterator 对比 Iterator(迭代器)是一种设计模式,是一个对象,用于遍历集合中的所有元素。 ...由于 List 类型的 Collection 是一个有序集合,对于拥有双向迭代是很有意义的。 ...链表迭代器有能够检测到这种修改的功能,当发现集合被修改了,将会抛出一个 ConcurrentModificationException 异常 为什么出现上面的这些现象与问题呢,我们还是从源码中寻找答案吧...源码分析 有多个集合类根据自己的特点实现了 ListIterator 接口,其实现都大同小异,这里我们主要分析 LinkedList 中所实现的 ListIterator。 ...首先我们来分析 LinkedList 的 listIterator() 和 listIterator(int index) 方法获取 ListIterator 迭代器过程。
ArrayList实现了List, RandomAccess, Cloneable, java.io.Serializable等接口。...源码解析 属性 /** * 默认容量 */private static final int DEFAULT_CAPACITY = 10;/** * 空数组,如果传入的容量为0时使用 */private...extends ArrayList { /** * 子类重写父类的方法,返回值可以不一样 * 但这里只能用数组类型,换成Object就不行 * 应该算是java...,只保留当前集合中不在c中的元素,不保留在c中不在当前集体中的元素。...private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{ // 防止序列化期间有修改
领取专属 10元无门槛券
手把手带您无忧上云