ArrayList 源码 概述

Posted HaSaKing_721

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList 源码 概述相关的知识,希望对你有一定的参考价值。

系列文章目录


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

ArrayList ,基于 [] 数组实现的,支持自动扩容的动态数组。相比数组来说,因为其支持自动扩容的特性,成为我们日常开发中,最常用的集合类,没有之一


提示:以下是本篇文章正文内容,下面案例可供参考

一、ArrayList 官方概述

public class ArrayList<E> extends AbstractList<E> 
	implements List<E>, RandomAccess, Cloneable, Serializable

可调整大小的数组的实现List接口。 实现所有可选列表操作,并允许所有元素,包括null 。 除了实现List 接口之外,该类还提供了一些方法来操纵内部使用的存储列表的数组的大小。 (这个类是大致相当于Vector,不同之处在于它是不同步的)。
该size,isEmpty,get,set,iterator和listIterator操作在固定时间内运行。 add操作以摊余常数运行 ,即添加n个元素需要O(n)个时间。 所有其他操作都以线性时间运行(粗略地说)。 与LinkedList实施相比,常数因子较低。

每个ArrayList实例都有一个容量 。 容量是用于存储列表中的元素的数组的大小。 它总是至少与列表大小一样大。 当元素添加到ArrayList时,其容量会自动增长。 没有规定增长政策的细节,除了添加元素具有不变的摊销时间成本。

应用程序可以添加大量使用ensureCapacity操作元件的前增大ArrayList实例的容量。 这可能会减少增量重新分配的数量。

请注意,此实现不同步。 如果多个线程同时访问884457282749实例,并且至少有一个线程在结构上修改列表,则必须在外部进行同步。 (结构修改是添加或删除一个或多个元素的任何操作,或明确调整后台数组的大小;仅设置元素的值不是结构修改。)这通常是通过在一些自然地封装了列表。 如果没有这样的对象存在,列表应该使用Collections.synchronizedList方法“包装”。 这最好在创建时完成,以防止意外的不同步访问列表:

二、类图

在这里插入图片描述

  • List 接口

提供数组的添加、删除、修改、迭代遍历等操作。

  • RandomAccess 接口

表示 ArrayList 支持快速的随机访问。实际是一个空接口,用于给类做标记,根据 List 的不同子类选择不同的遍历方式, 提升算法性能,在源码体现

  • Serializable 接口

实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复

  • Cloneable 接口

实际就是一个标记类,就是打上cloneable标记,没实现就是没这个标记。
然后到clone()的基本实现中,JVM会去检测要clone的对象的类有没有被打上这个标记,有就让clone,没有就抛异常。

  • AbstractList 抽象类

基于模板方法设计模式。提供了 List 接口的骨架实现,大幅度的减少了实现迭代遍历相关操作的代码

三、属性

在这里插入图片描述
两个属性

/**
 * 元素数组。
 *
 * 当添加新的元素时,如果该数组不够,会创建新数组,并将原数组的元素拷贝到新数组。之后,将该变量指向新数组。
 *
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer. Any
 * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
 * will be expanded to DEFAULT_CAPACITY when the first element is added.
 */
transient Object[] elementData; // non-private to simplify nested class access 不使用 private 修复,方便内嵌类的访问。

/**
 * 已使用的数组大小
 *
 * The size of the ArrayList (the number of elements it contains).
 *
 * @serial
 */
private int size;

总结

提示:常用方法在下一节讲解:

以上是关于ArrayList 源码 概述的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList 源码 概述

Java源码--LinkedList源码概述

JDK源码分析-ArrayList

Java Review - ArrayList 源码解读

ArrayList源码分析

源码阅读Java集合 - ArrayList深度源码解读