ArrayList源码分析--jdk1.8

Posted

tags:

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

ArrayList概述

  1. ArrayList是可以动态扩容和动态删除冗余容量的索引序列,基于数组实现的集合。
  2. ArrayList支持随机访问、克隆、序列化,元素有序且可以重复。
  3. ArrayList初始默认长度10,使用Object[]存储各种数据类型。

ArrayList数据结构

  数据结构是集合的精华所在,数据结构往往也限制了集合的作用和侧重点,了解各种数据结构是我们分析源码的必经之路。
  ArrayList的数据结构如下:
技术图片

ArrayList源码分析

/*
 * 用数组实现的集合,支持随机访问,元素有序且可以重复
 * RandomAccess(ArrayList) 支持快速随机访问,使用for循环更加快速
 * LinkedList 使用 iterator迭代器更加 快速
 * RandomAccess 这是一个标记接口,一般此标记接口用于 List 实现,以表明它们支持快速(通常是恒定时间)的随机访问。
 * 该接口的主要目的是允许通用算法改变其行为,以便在应用于随机或顺序访问列表时提供良好的性能
 */
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

 /**
     * 默认长度  10
     */
    private static final int DEFAULT_CAPACITY = 10;

    /**
     * 默认空的数组
     */
    private static final Object[] EMPTY_ELEMENTDATA = ;

    /**
     * ArrayList中的元素  是Object[]类型的数组
     */
    transient Object[] elementData; // non-private to simplify nested class access

    /**
     * 动态数组的实际大小 ,默认为0
     * @serial
     */
    private int size;

         /**
     * 集合长度构造函数
     */
    public ArrayList(int initialCapacity) 
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
    

         /**
     * 无参构造函数,设置元素数组为空 注意此时初始容量是0,而不是大家以为的 10
     */
    public ArrayList() 
        super();
        this.elementData = EMPTY_ELEMENTDATA;
    

    /**
     * 集合参数构造函数
     */
    public ArrayList(Collection<? extends E> c) 
        elementData = c.toArray(); // 转化为数组
        size = elementData.length;
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class) //是否成功转化为Object类型数组
            elementData = Arrays.copyOf(elementData, size, Object[].class); //不为Object数组的话就进行复制
    

ArrayList继承和实现分析
技术图片
   ArrayList extends AbstractList
   AbstractList extends AbstractCollection
  所有类都继承Object 所以ArrayList的继承结构就是上图这样。

以上是关于ArrayList源码分析--jdk1.8的主要内容,如果未能解决你的问题,请参考以下文章

JDK1.8中ArrayList的实现原理及源码分析

ArrayList源码分析--jdk1.8

ArrayList源码分析(基于JDK1.8)

ArrayList 源码分析(JDK1.8)

ArrayList源码分析(基于JDK1.8)

ArrayList源码阅读分析(JDK1.8)