JDK源碼-List系列

List

  • List是一個有序的集合.使用者可以直接通過下標來獲取元素.
  • List與Set不同,它允許重復元素的存在.
  • List繼承與Collections,它的主要實現有ArrayList,LinkedList,Vector等等.
  • 集合在遍歷的同時,進行插入刪除操作會造成錯誤.
ArrayList
  • List的一個實現類,同時也繼承了接口RandomAccess,Cloneable, java.io.Serializable.它是具有fail-fast機制.

  • ArrayList默認的容量大小為10

/**
     * Default initial capacity.
     */
    private static final int DEFAULT_CAPACITY = 10;
  • ArrayList提供了兩個默認的空數據存儲對象.調用無參構造器的時候,真正存儲數據的elementData對象將會賦值為DEFAULTCAPACITY_EMPTY_ELEMENTDATA;調用有參的構造器時,elementData賦值為EMPTY_ELEMENTDATA.那么,為甚么要這樣做?他是為了,在數據添加并且進行擴容的時候,知道當前容器擴容的大小.當elementData為DEFAULTCAPACITY_EMPTY_ELEMENTDATA時,就會自動擴容到DEFAULT_CAPACITY或者傳入minCapacity(擴容大小);而當elementData為EMPTY_ELEMENTDATA時,好,這個時候elementData的大小已經是確定的了,直接根據elementData.length擴容至其1.5倍即可.
/**
     * 在有參構造時,被調用
     */
    private static final Object[] EMPTY_ELEMENTDATA = {};

    /**
     * 在無參構造時,被調用
     */
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
  • ArrayList對外提供的擴容方法:
/**
     * Increases the capacity of this <tt>ArrayList</tt> instance, if
     * necessary, to ensure that it can hold at least the number of elements
     * specified by the minimum capacity argument.
     *
     * @param   minCapacity   the desired minimum capacity
     */
    public void ensureCapacity(int minCapacity) {
        int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
            // any size if not default element table
            ? 0
            // larger than default for default empty table. It's already
            // supposed to be at default size.
            : DEFAULT_CAPACITY;

        if (minCapacity > minExpand) {
            ensureExplicitCapacity(minCapacity);
        }
    }
  • ArrayList對外提供了將容器大小轉為當前容器存儲元素個數大小的方法.
/**
     * Trims the capacity of this <tt>ArrayList</tt> instance to be the
     * list's current size.  An application can use this operation to minimize
     * the storage of an <tt>ArrayList</tt> instance.
     */
    public void trimToSize() {
        modCount++;
        if (size < elementData.length) {
            elementData = (size == 0)
              ? EMPTY_ELEMENTDATA
              : Arrays.copyOf(elementData, size);
        }
    }
  • ArrayList無法保證線程安全,需要使用者自己保證線程安全.
LinkedList
  • 底層通過雙向鏈表機制實現.
  • 插入或者刪除元素時,時間復雜度為O(1);查詢元素時時間復雜度為O(n);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容