arraylist源码解析

白彬 白彬     2022-08-10     451

关键词:

巩固下基础,阅读下jdk的源码,这篇文章是来介绍下ArrayList的实现。

1. ArrayList概述

    List 接口的大小可变数组的实现,位于API文档的java.util.ArrayList<E>。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。)

2. ArrayList的继承体系

  

  Iterable: 该接口声明了迭代器。

  Collection: 集合框架的顶级接口,有两个比较重要的实现,List和Set。

  AbstractCollection: 抽象类,实现了Collection接口中部分方法。

  List: 有序的Collection,此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

  Cloneable:克隆接口,它的实现可以通过重写Object.clone来实现对象的克隆。

  Serializable :类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

  AbstractList:继承了AbstractCollection,重写了部分方法。此类提供 List 接口的骨干实现,以最大限度地减少实现“随机访问”数据存储(如数组)支持的该接口所需的工作.

  RandomAccess: List 实现所使用的标记接口,用来表明其支持快速(通常是固定时间)随机访问。此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。

3. ArrayList的实现:

成员变量

private transient Object[] elementData;//底层使用数组实现
private int size;//ArrayList中元素的个数
private static final int DEFAULT_CAPACITY = 10;//默认的增长因子
private static final Object[] EMPTY_ELEMENTDATA = {};//预留的空数组

 

 

构造函数    

 1  /**
 2      * 指定初始长度的list
 3      * @param initialCapacity 初始长度
 4      */
 5     public ArrayList(int initialCapacity) {
 6         if (initialCapacity > 0) {//如果初始长度>0,就创建一个指定长度的Object数组
 7             this.elementData = new Object[initialCapacity];
 8         } else if (initialCapacity == 0) {//如果给定的初始长度=0,则指向一个空的Object数组
 9             this.elementData = EMPTY_ELEMENTDATA;
10         } else {//如果给定的初始长度<0,则抛出一个异常,因为无法创建负长度的数组
11             throw new IllegalArgumentException("Illegal Capacity: " +
12                     initialCapacity);
13         }
14     }
15 
16     /**
17      * 默认长度的list创建
18      */
19     public ArrayList() {
20         //底层数组指向默认的空的Object数组
21         this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
22     }
23 
24     /**
25      * 创建一个新的ArrayList,并且将一个实现了Collection接口的对象里的元素拷贝到我们的新ArrayList中
26      * @param c
27      */
28     public ArrayList(Collection<? extends E> c) {
29         //将传入的对象转换为数组,并且将elementData指向该数组
30         elementData = c.toArray();
31         //如果c的长度为0,则指向预留的空数组,如果长度不为0,且c对象的泛型并不是Object,则通过静态方法Arrays.copyOf()将数据拷贝到一个新的数组里
32         if ((size = elementData.length) != 0) {
33             if (elementData.getClass() != Object[].class)
34                 elementData = Arrays.copyOf(elementData, size, Object[].class);
35         } else {
36             this.elementData = EMPTY_ELEMENTDATA;
37         }
38     }

 

arraylist源码解析

...误或描述不准确的地方,还请大家指出。回到顶部1.位置ArrayList位于java.util包中。1packagejava.util;23importjava.util.function.Consumer;4importjava.util.f 查看详情

arraylist源码解析

 这篇文章主要看ArrayList的Iterator和ListIterator的实现。1.Iterator和类Itr当我们调用iterator方法时返回一个Iterator。/***Returnsaniteratorovertheelementsinthislistinpropersequence.**<p>Thereturnediteratoris<ahref="#f 查看详情

arraylist源码解析

add操作:privatetransientObject[]elementData;privatestaticfinalintDEFAULT_CAPACITY=10;publicArrayList(){super();this.elementData=EMPTY_ELEMENTDATA;}publicArrayList(intinitialCapacity){super();if(initialC 查看详情

arraylist源码解析

...下Java源码是如何实现线性表的,这一篇主要讲解顺序表ArrayList链式表下一篇在提及。1:ArrayList结构图2:关于Collection和List的区别最好的比对就是查看他们的源码我们先看Collection的所有接口publicinterfaceCollection<E>extendsIterable&l... 查看详情

arraylist源码解析

巩固下基础,阅读下jdk的源码,这篇文章是来介绍下ArrayList的实现。1.ArrayList概述    List 接口的大小可变数组的实现,位于API文档的java.util.ArrayList<E>。实现了所有可选列表操作,并允许包括null在内的所有元素。除... 查看详情

vector源码解析

Vector源码解析    在之前文章ArrayList源码解析中分析了一下 ArrayList的源码和一些重要方法,现在对比 ArrayList,总结一下 Vector和 ArrayList的不同。1Vector介绍 1publicclassVector<E>2extendsAbstractList<E>3implemen 查看详情

arraylist源码解析

 1.isEmpty()   如果此列表中没有元素,则返回true/***Returns<tt>true</tt>ifthislistcontainsnoelements.*/publicbooleanisEmpty(){returnsize==0;}  判断ArrayList是否为空,size为0时,即不包含任何成员时为空,返回true。2.index 查看详情

arraylist源码及解析

packagejava.util;importjava.util.function.Consumer;importjava.util.function.Predicate;importjava.util.function.UnaryOperator;publicclassArrayList<E>extendsAbstractList<E>implementsList< 查看详情

java集合干货系列-arraylist源码解析

前言今天来介绍下ArrayList,在集合框架整体框架一章中,我们介绍了List接口,ArrayList继承了AbstractList,实现了List。ArrayList在工作中经常用到,所以要弄懂这个类是极其重要的。构造图如下:蓝色线条:继承绿色线条:接口实现正... 查看详情

集合篇-arraylist源码解析

和LinkedList的区别:ArrayList:底层是动态数组,支持扩容,线程不安全。对于添加和删除方法,如果是添加到列表尾部,时间复杂度是O(1);如果是添加到指定位置i,时间复杂度就是O(n-i),因为需要将后续数组的元素往后移动一位... 查看详情

arraylist源码解析(代码片段)

一、ArrayList认识  ArrayList是可以动态增长和缩减的索引序列,它是基于数组实现的List类。如图   二、源码解析 内部存储元素是数组,默认数据大小是10,下面介绍常用方法。2.1、构造方法ArrayList():构造一个初... 查看详情

源码解读:arraylist源码解析(jdk8)(代码片段)

ArrayList源码解析(JDK8)更详细的讲解可以参考这篇博文,本文只讲解在阅读源码中个人遇到的问题。面试必备:ArrayList源码解析(JDK8)构造函数/***ArrayList容器默认初始容量*/privatestaticfinalintDEFAULT_CAPACITY=10;/***用于有参构造的空... 查看详情

java集合系列:arraylist详细介绍(源码解析)和使用示例

...Collection的具体实现类进行讲解;首先,讲解List,而List中ArrayList又最为常用。因此,本章我们讲解ArrayList。先对ArrayList有个整体认识,再学习它的源码,最后再通过例子来学习如何使用它。第1部分ArrayList介绍ArrayList简介ArrayList... 查看详情

java集合系列03之arraylist详细介绍(源码解析)和使用示例

...Collection的具体实现类进行讲解;首先,讲解List,而List中ArrayList又最为常用。因此,本章我们讲解ArrayList。先对ArrayList有个整体认识,再学习它的源码,最后再通过例子来学习如何使用它。内容包括:第1部分ArrayList简介第2部分A... 查看详情

copyonwritearraylist源码解析

  CopyOnWriteArrayList是java1.5版本提供的一个线程安全的ArrayList变体。在讲解5.1.1ArrayList的时候,有说明ArrayList的fail-fast特性,它是指在遍历过程中,如果ArrayList内容发生过修改,会抛出ConcurrentModificationException。在多线程环境... 查看详情

顺序线性表----arraylist源码解析及实现原理分析

原创播客,如需转载请注明出处。原文地址:http://www.cnblogs.com/crawl/p/7738888.html ----------------------------------------------------------------------------------------------------------------------------------- 查看详情

arraylist及其源码解析

...,所以其特点是读取数据比较容易,插入删除比较困难2.arraylist源码分析  1)构造方法(默认容量为10)  2)插入数据  扩容操作newCapacity=oldCapacity+oldCapacity>>1  3)删除操作  4)遍历操作  arraylist在进行遍历操作... 查看详情

arraylist源码解析自动扩容机制与add操作

目录1.ArrayList的自动扩容机制2.add操作 正文  本篇主要分析ArrayList的自动扩容机制,add和remove的相关方法。  作为一个list,add和remove操作自然是必须的。  前面说过,ArrayList底层是使用Object数组实现的。数组的特性是... 查看详情