乌市泽哥 发表于 2023-7-21 16:01:40

ArrayList集合

一. 介绍
    ArrayList是List接口的一个实现类,它是Java程序中最常用的集合之一。在ArrayList内部,它使用一个可变长度的数组来存储元素。当向ArrayList中添加元素时,如果当前的数组容量不足以容纳新增的元素,ArrayList会自动进行扩容操作,创建一个更大的数组,并将原始数据复制到新数组中。这样就实现了ArrayList的长度可变性。通过索引可以快速访问和修改ArrayList中的元素,同时也支持进行插入、删除等操作。ArrayList允许null值存在。
    ArrayList是有序的数组,当你向ArrayList中添加元素时,它们会按照添加的顺序进行存储,并且保持这个顺序。因此,你可以通过索引来访问ArrayList中的元素,并且它们会按照添加的顺序进行返回。
    ArrayList结构图:    
    https://img2023.cnblogs.com/blog/3234883/202307/3234883-20230716210337648-1681067686.png
    ArrayList继承AbstractList,AbstractList是一个抽象类,提供了一些通用的列表操作方法。
    ArrayList实现RandomAccess接口,表示允许通过索引直接访问集合中的元素;
    ArrayList实现Cloneable接口,表示可以进行克隆操作;
    ArrayList实现Serializable接口,表示可以进行序列化操作。
 
二. ArrayList的优点
     动态增长:ArrayList底层数据结构是Object数组(Object[])。在ArrayList中,每次添加、删除、查询等操作都是直接对这个底层的Object数组进行实现。当元素数量超过当前数组长度时,ArrayList会根据需要自动进行扩容操作,通常会创建一个新的更大的数组,并将原有元素复制到新数组中。这样就能保证ArrayList的高效操作和动态调整大小的特性。
    高效的随机访问:ArrayList内部以数组形式存储元素,元素是按照索引顺序存储的,每个元素占据连续的内存空间。由于数组具有随机访问的特性,通过索引可以直接计算出元素在内存中的地址,从而实现快速的随机访问操作。因此支持通过索引快速随机访问元素。可以使用get()方法通过索引获取元素,时间复杂度为O(1)。
    方便的插入和删除操作:ArrayList提供了丰富的方法来进行元素的插入和删除操作。通过add()方法可以在任意位置插入元素,通过remove()方法可以删除指定位置的元素,或者通过元素值来删除。
    支持多种数据类型:ArrayList可以存储任何类型的对象,包括基本数据类型的包装类、自定义对象等。这使得ArrayList成为一个很灵活的集合类,适用于各种场景。
    支持迭代操作:ArrayList实现了Iterable接口,因此可以使用增强的for循环或者迭代器来遍历集合中的元素。这使得对ArrayList进行遍历操作变得非常便捷。
  需要注意的是,由于ArrayList的底层实现是数组,所以在频繁进行插入和删除操作时,会涉及数组元素的移动,性能可能受到影响。此时可以考虑使用LinkedList等其他集合类来代替ArrayList。
 
三. 源码分析 
   成员方法:
    https://img2023.cnblogs.com/blog/3234883/202307/3234883-20230716212726253-49937111.png 
    private static final int DEFAULT_CAPACITY = 10;
      默认初始化容器 = 10;
     privatestaticfinal Object[] EMPTY_ELEMENTDATA = {}; 
      用于空实例的共享空数组 ,一般在构造方法指定空容器,或在elementData、size()为0的时候使用。
     private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {} 
      共享的空数组实例用于默认大小的空实例。我们通过区分它与EMPTY_ELEMENTDATA来知道在添加第一个元素时需要扩容多少。
     ransient Object[] elementData;
      ArrayList的内部使用数组缓冲区来存储其元素。                    
      ArrayList的容量是该数组缓冲区的长度。当第一个元素被添加到elementData为DEFAULTCAPACITY_EMPTY_ELEMENTDATA的空ArrayList时,它将会被扩展到DEFAULT_CAPACITY(默认容量)。
    private int size;            
      ArrayList的大小(包含的元素数)
 
  构造方法:
    1. 构造一个具有指定初始容量的空列表。
    https://img2023.cnblogs.com/blog/3234883/202307/3234883-20230716220114207-2007461110.png
    @param initialCapacity 列表的初始容量     
    @throws IllegalArgumentException 如果指定的初始容量为负,则声明非法数据异常
    public ArrayList(int initialCapacity) {      // 该构造方法指定初始容量
      if (initialCapacity > 0) {                  // 如果初始容量>0 则 elementData.size() = 初始容量
        this.elementData = new Object;
       } else if (initialCapacity == 0) {     // 如果初始容量=0 则elementData.size() = 0 (EMPTY_ELEMENTDATA )
        this.elementData = EMPTY_ELEMENTDATA;

      } else {            // 如果初始化容量
页: [1]
查看完整版本: ArrayList集合