集合源码阅读——ArrayList】的更多相关文章

一.前言 在前面几篇,我们已经学习了常见了Map,下面开始阅读实现Collection接口的常见的实现类.在有了之前源码的铺垫之后,我们后面的阅读之路将会变得简单很多,因为很多Collection的结构与Map的类似,甚至有不少是直接用了Map里的方法.接下来让我们一起来看一下ArrayList的源码. 二.ArrayList结构概览 顾名思义,ArrayList的结构实际就是一个Object[].所以它的特性很明显,插入一个元素的时候,是耗时是一个常量时间O(1),在插入n个元素的时候,需要的…
ArrayList 关键点: >>扩容每次扩容1.5倍 >>modcount的作用 >>ArrayList的父类AbstractList的成员变量 >>ArrayList中的许多方法都会出现modcount++的操作 >>ArrayList中的迭代器,返回一个Itr类型的对象 >>modCount在操作ArrayList的时候会自增, 用来记录操作的次数. >>父类AbstractList中的expectedModCoun…
Vector是List接口的另一实现,有非常长的历史了,从jdk1.0开始就有Vector了,先于ArrayList出现,与ArrayList的最大区别是:Vector 是线程安全的,简单浏览一下Vector: 类定义: public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable Vector支持快速随机访…
Stack类也是List接口的一种实现,也是一个有着非常长历史的实现,从jdk1.0开始就有了这个实现. Stack是一种基于后进先出队列的实现(last-in-first-out (LIFO)),实际上jdk也提供了有关队列的其他实现,这里就先看看Stack的实现: 类定义: public class Stack<E> extends Vector<E> { //从类定义看,Stack是线程安全的 ..... } 看看Stack提供的一些CRUD方法: /** * Pushes…
一.前言 今天我们来看一下本次集合源码阅读里的最后一个Map--IdentityHashMap.这个Map之所以放在最后是因为它用到的情况最少,也相较于其他的map来说比较特殊.就笔者来说,到目前为止还没有用到过它 ┐(゚-゚)┌.它的罕见与它的用途有关,当时的Map设计者是这么说的: This class is designed for use only in the rare cases wherein reference-equality semantics are required. 这…
一.前言 今天开始阅读jdk1.8的集合部分,平时在写项目的时候,用到的最多的部分可能就是Java的集合框架,通过阅读集合框架源码,了解其内部的数据结构实现,能够深入理解各个集合的性能特性,并且能够帮助自己在今后的开发中避免犯一些使用错误.另外笔者自己也是摸着石头过河,如果有描述不当的地方,希望园友们能够不吝指出,希望能够和大家共同进步! 二.集合框架概览图 可以看到集合的基础接口是Map, Collection以及Iterator.其余的类都实现自这3个类. 虚线箭头:依赖(即指向类里面包含了…
一.前言 这次我们来看一下常见的List中的第二个--LinkedList,在前面分析ArrayList的时候,我们提到,LinkedList是链表的结构,其实它跟我们在分析map的时候讲到的LinkedHashMap的结构有一定的相似,但是相对简单很多,今天再详细的看一下它的具体结构,以及使用的场景等. 二.LinkedList结构概览 在看具体的结构之前我们先来看一下它的继承关系: 与ArrayList不同的是,LinkedList继承了AbstractSequentialList,从Seq…
一,前言 ArrayList是Java开发中使用比较频繁的一个类,通过对源码的解读,可以了解ArrayList的内部结构以及实现方法,清楚它的优缺点,以便我们在编程时灵活运用. 二,ArrayList结构 如上图所示:ArrayList是一种线性数据结构,它的底层是用数组实现的,相当于动态数组.与Java中的数组相比,它的容量能动态增长.类似于C语言中的动态申请内存,动态增长内存. 当创建一个数组的时候,就必须确定它的大小,系统会在内存中开辟一块连续的空间,用来保存数组,因此数组容量固定且无法动…
一.前言 笔者之前看过一篇关于jdk1.8的HashMap源码分析,作者对里面的解读很到位,将代码里关键的地方都说了一遍,值得推荐.笔者也会顺着他的顺序来阅读一遍,除了基础的方法外,添加了其他补充内容. 二.HashMap结构概览 以下是HashMap的数据结构: 不同于之前的jdk的实现,1.8采用的是数组+链表+红黑树,在链表过长的时候可以通过转换成红黑树提升访问性能.大多数情况下,结构都以链表的形式存在,所以检查是否存在树节点会增加访问方法的时间,但是相较于其优点来说还是可以接受的. 三.…
ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类. ArrayList实现了Serializable接口,因此它支持序列化,能够通过…
基于jdk1.8的HashMap源码分析. 引用于:http://blog.stormma.me/2017/05/31/Java%E9%9B%86%E5%90%88%E6%BA%90%E7%A0%81%E9%98%85%E8%AF%BB%E4%B9%8BHashMap/ 前期准备 什么是HashMap 官方解释 Hash table based implementation of the Map interface. This implementation provides all of the…
这是博主第二次读ArrayList 源码,第一次是在很久之前了,当时读起来有些费劲,记得那时候HashMap的源码还是哈希表+链表的数据结构. 时隔多年,再次阅读起来ArrayList感觉还蛮简单的,但是HashMap已经不是当年的HashMap了,所以下一篇会写HashMap的. 起因:最近写了一个简单的文件校验方法,然后犯了一些比较低级的错误,博主的师兄在进行发布CR时,提出了一些建议,博主感觉羞愧难当,特此记录一下,诸君共勉.代码以及建议如下,已做脱敏处理: /** * 修改前 */ pu…
1简介 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable ArrayList使用一个可变数组实现List接口,实现了List接口的所有可选操作.ArrayList除了是非线程安全的之外,其他的与Vector类似. 2成员属性 //序列化版本号 private static final lon…
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable ArrayList继承了AbstractList抽象类,实现了List.RandomAccess.Cloneable.Serializable接口.ArrayList的默认初始容量为10,阅读源码可知--底层数据结构是数组.添加的元素是可以重…
序 如同C语言中字符数组向String过渡一样,作为面向对象语言,自然而然的出现了由Object[]数据形成的集合.本文从JDK源码出发简单探讨一下ArrayList的几个重要方法. Fields //序列化Id保证了集合是可以进行RPC通信的 private static final long serialVersionUID = 8683452581122892189L; //作为一个普通Object[]数组,集合的默认长度是10 private static final int DEFAU…
一.前言 这一篇里,我将对HashSet.LinkedHashSet.TreeSet进行汇总分析,并不打算一一进行详细介绍,因为JDK对Set的实现进行了取巧.我们都知道Set不允许出现相同的对象,而Map也同样不允许有两个相同的Key(出现相同的时候,就执行更新操作).所以Set里的实现实际上是调用了对应的Map,将Set的存放的对象作为Map的Key. 二.源码分析 这里笔者就以最常用的HashSet为例进行分析,其余的TreeSet.LinkedHashSet类似,就不赘述了. 2.1 结…
工作中每天都会和java集合打交道,虽然以前也看过jdk源码的实现,但有些东西时间长了还是会遗忘,或者有些实现在新版本中有了新的变化,俗话说"温故而知新",所以打算再阅读一下相关源码. java集合包含collection接口的子接口和实现类以及Map接口的子接口和实现两大块,首先先看看这两大块大致内容: Collection接口的子接口及实现: Map接口的子接口及实现:…
一.前言 在上一篇随笔中,我们分析了HashMap的源码,里面涉及到了3个钩子函数,用来预设给子类--LinkedHashMap的调用,所以趁热打铁,今天我们来一起看一下它的源码吧. 二.LinkedHashMap的结构与继承关系 2.1 LinkedHashMap的数据结构 可以从上图中看到,LinkedHashMap数据结构相比较于HashMap来说,添加了双向指针,分别指向前一个节点--before和后一个节点--after,从而将所有的节点已链表的形式串联一起来,从名字上来看Linked…
一.前言 在前一篇博客中,我们对TreeMap的继承关系进行了分析,在这一篇里,我们将分析TreeMap的数据结构,深入理解它的排序能力是如何实现的.这一节要有一定的数据结构基础,在阅读下面的之前,推荐大家先看一下:<算法4>深入理解红黑树.(个人比较喜欢算法四这里介绍的红黑树实现:从2-3树到红黑树的过渡很清晰,虽然源码里的实现不是这种方式 T^T),先了解一下红黑树的由来以及它的特性,这样能更好的理解TreeMap的实现. 二. TreeMap的结构 TreeMap的内部实现就是一个红黑树…
JDK8的HashMap数据结构上复杂了很多,因此读取效率得以大大提升,关于源码中红黑树的增删改查,博主没有细读,会在下一篇博文中使用Java实现红黑树的增删改查. 下面是类的结构图: 代码(摘抄自JDK): import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.*; /** * hashMap * 作为Kit ,保证健壮.高效,然后才是可阅读性 * http://w…
一.前言 在前面两篇随笔中,我们提到过,当HashMap的桶过大的时候,会自动将链表转化成红黑树结构,当时一笔带过,因为我们将留在本章中,针对TreeMap进行详细的了解. 二.TreeMap的继承关系 下面先让我们来看一下TreeMap的继承关系,对它有一个大致的了解: 可以看到,除了在之前HashMap里常见的继承类和接口以外,TreeMap实现了NavigableMap接口,而NavigableMap继承自SortedMap,由名字可以看出,只是一个用来实现排序的接口.而这也是为什么Tre…
ArrayList是jdk1.2开始新增的List实现,首先看看类定义: public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { ........... } ArrayList实现List接口,上层接口是Collection,顶级接口是Iterable,同时还实现了Cloneable.Seri…
参考文档: https://cloud.tencent.com/developer/article/1145014 https://segmentfault.com/a/1190000018578944 http://www.importnew.com/9928.html https://blog.csdn.net/zero__007/article/details/52166306 1. ArrayList简介 ArrayList底层基于数组实现的一种线性数据结构,通过数组的索引原理实现了快速…
先看看类定义: public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { ....... } LinkedList与ArrayList相比,LinkedList不再实现RandomAccess接口,表明不支持快速随机访问数据,但实现了Deque接口,可当队列使用,Deq…
1 继承结构图 ArrayList继承AbstractList,实现了List接口 2 构造函数 transient Object[] elementData; // 数组保存元素 private int size; // 记录长度 size记录ArrayList的长度,elementData记录元素的值 transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分.当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量…
ArrayBlockingQueue是一个先进先出线程安全的队列,队列头部是进入队列时间最长的元素,队尾是进入队列时间最短的元素,同时队列的最大容量是固定的. 先看类定义: public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { ...... } ArrayBlockingQueue实现了Blocking…
一.前言 ​ 万丈高楼平地起,相信要想学好java,仅仅掌握基础的语法是远远不够的,从今天起,笔者将和园友们一起阅读jdk1.8的源码,并将阅读重点放在常见的诸如collection集合以及concurrent并发两块,另外笔者自己也是摸着石头过河,如果有描述不当的地方,希望园友们能够不吝指出,希望能够和大家共同进步! 二.jdk1.8新特性简述 ​ 相较于之前的jdk版本,jdk1.8加入了很多新特性,诸如Lambda表达式,函数式接口,时间的处理类等新特性,值得一提的是可以在Interfac…
Java 源码阅读的第一步是Collection框架源码,这也是面试基础中的基础: 针对Collection的源码阅读写一个系列的文章,从ArrayList开始第一篇. ---@pdai JDK版本 JDK 1.8.0_110 概述总结 ArrayList底层是通过数组实现的:其中capacity表示底层数组的长度,而ArrayList长度由size表示: ArrayList允许存放null元素,也可以查找null所在的index, 比如indexOf(), lastIndexOf()方法: A…
转载自 java8 ArrayList源码阅读 本文基于jdk1.8 JavaCollection库中有三类:List,Queue,Set 其中List,有三个子实现类:ArrayList,Vector,LinkedList http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/util/ArrayList.java 实现原理 transient Object[] elementData; // 存放元素…
ArrayList概述 ArrayList是一个的可变数组的实现,实现了所有可选列表操作,并允许包括 null 在内的所有元素.每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小.它总是至少等于列表的大小.随着向ArrayList中不断添加元素,其容量也自动增长.自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造ArrayList时指定其容量.在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容…