Java 之 List 接口的實現:ArrayList


Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
Hashtable
├HashMap
└WeakHashMap

        ArrayList 是List<T> 下,java的自實現類之一,屬於線程非安全的類型,多線程環境下可以考慮用Collections.synchronizedList(List l)函數返回一個線程安全的ArrayList類,也可以使用concurrent並發包下的CopyOnWriteArrayList類,還可以考慮使用Vector這個類型。

  ArrayList的內部存儲結構是一個可擴展的動態數組(其實並沒有動態擴展,只是一個普通的數組,當數組被填充滿時,再申請新的數組結構,然后把值拷過去,新的大小為1.5*n+1 )

       private transient Object[] elementData;  

       ArrayList實現了Serializable接口,因此它支持序列化,能夠通過序列化傳輸,實現了RandomAccess接口,支持快速隨機訪問,實際上就是通過下標序號進行快速訪問,實現了Cloneable接口,能被克隆。

   每個ArrayList實例都有一個容量,該容量是指用來存儲列表元素的數組的大小。它總是至少等於列表的大小。隨着向ArrayList中不斷添加元素,其容量也自動增長。自動增長會帶來數據向新數組的重新拷貝,因此,如果可預知數據量的多少,可在構造ArrayList時指定其容量。在添加大量元素前,應用程序也可以使用ensureCapacity操作來增加ArrayList實例的容量,這可以減少遞增式再分配的數量,這點前邊的括號內已經有提過。

  另外 ArrayList 還采用了 Fail-Fast機制: 通過記錄modCount參數來實現。在面對並發的修改時,迭代器很快就會完全失敗,而不是冒着在將來某個不確定時間發生任意不確定行為的風險。

      下面介紹ArrayList 的構造函數,自帶三種構造函數:

       (1)可以構造一個默認初始容量為10的空列表  public ArrayList()

       (2)構造一個指定初始容量的空列表   public ArrayList(int initialCapacity) 

  (3)構造一個包含指定collection的元素的列表(在ArrayList中的順序為Collection中迭代的順序)public ArrayList(Collection<? extends E> c) 

 

       下面介紹常用的API

  1、增

       public E set(int index, E element)//在指定的位置用新節點替換掉原來的舊結點,同時返回舊結點

       public boolean add(E e)//給隊列添加一個新的元素,這個元素將會被放置在隊列的最末端

       public void add(int index, E element) //在指定位置插入一個元素,原有元素將會依次被推后一位,注意index不能大於隊列的當前長度

       public boolean addAll(Collection<? extends E> c)//以collection迭代器的順序,依次把collection中的元素放置在隊列的末尾

       public boolean addAll(int index, Collection<? extends E> c)//以collection迭代器的順序,依次
//把collection中的元素放置在隊列的指定索引上,原有元素一次推后

 另外還可以將原有隊列轉換為數組形式

public Object[] toArray() 

 

  2、刪

public E remove(int index)//刪除指定位置的元素

public boolean remove(Object o)//刪除第一個等於 obj的元素(用equals方法判斷)

此外還可以采用如下形式刪除:

 protected void removeRange(int fromIndex, int toIndex)

這個方法有以下幾點注意
1、方法時protected 類型的,2、將fromindex 到toindex這段的結點都移除掉,后續的結點跟進。3、隊列的長度變為index ,也就是toindex位置之后的元素也都將被移除。

    也可以使用這種方法來實現類似RangeMove的形式

         ArrayList<Integer> ints = new ArrayList<Integer>(Arrays.asList(0, 1, 2,3, 4, 5, 6));  
         ints.subList(2, 4).clear();  

  3、改

(1)修改隊列的最大容積

前文中有提到過,當數組的容積滿了之后,我們會重新設定數組的容積,以滿足繼續添加的需要

數組擴容通過一個公開的方法ensureCapacity(int minCapacity)來實現,我們也可以手動調用這個方法來增加容積

當設定的最小容積小於 原有容積的1.5倍之后,我們會按照1.5倍的舊容積來替代,否則將以參數的大小來替代,生成新的數組。

由於設定容積后,會調用一次數組的拷貝方法,此處非常耗費性能,所以最好在盡可能早的時候(元素少時),預判出數組的大小,從而防止大量的新增元素后,不斷的調用擴大容積和復制的方法。

public void ensureCapacity(int minCapacity)

(2)有時,ArrayList的大小剛剛好是,內部動態數組的一半多一點點,接近半數的數組元素被閑置。或者我們一開始設置的空間過大時,可以采用如下方法來修正 動態數組的大小

public void trimToSize()

 

  4、查

 public E get(int index)// 返回此列表中指定位置上的元素。


參考文獻:http://zhangshixi.iteye.com/blog/674856

http://www.cnblogs.com/ITtangtang/p/3948555.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM