ArrayList源碼分析--jdk1.8

ArrayList概述

  1. ArrayList是可以動態擴容和動態刪除冗餘容量的索引序列,基於數組實現的集合。
  2. ArrayList支持隨機訪問、克隆、序列化,元素有序且可以重複。
  3. ArrayList初始默認長度10,使用Object[]存儲各種數據類型。

ArrayList數據結構

  數據結構是集合的精華所在,數據結構往往也限制了集合的作用和側重點,瞭解各種數據結構是我們分析源碼的必經之路。
  ArrayList的數據結構如下:
ArrayList源碼分析--jdk1.8

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源碼分析--jdk1.8
   ArrayList extends AbstractList
   AbstractList extends AbstractCollection
  java中所有類都繼承Object,所以ArrayList的繼承結構如上圖。
   1. AbstractList是一個抽象類,實現了List<E>接口,List<E>定義了一些List通用方法,而AbstractList抽象類中可以有抽象方法,還可以有具體的實現方法,AbstractList是實現接口中一些通用的方法,實現了基礎的add/get/indexOf/iterator/subList/RandomAccessSubList方法,ArrayList再繼承AbstractList,拿到通用基礎的方法,然後自己在實現一些自己特有的方法,這樣的好處是:讓代碼更簡潔,繼承結構最底層的類中通用的方法都抽取出來,先一起實現了,減少重複代碼。
   2.ArrayList實現了List<E>、RandomAccess、Cloneable、Serializable

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章