List(JDK1.7)(1)

java.util包.imagejava

與Set不一樣, List容許重複的元素。即 e1.equals(e2)。數組

部分方法定義

  • int size();

返回列表中元素的個數,若是超過Integer.MAX_VALUE,就返回Integer.MAX_VALUE安全

  • boolean isEmpty();
  • boolean contains(Object o);

對於目標元素o, 若是列表中至少存在一個元素e:o==null? e==null ; o.eqauls(e)。多線程

若是目標元素不可比較,將會拋出異常:ClassCastException.線程

若是目標元素爲null,而且該列表不容許null元素,則拋出異常:NullPointerException.3d

  • Iterator<E> iterator();
  • Object[] toArray();

以恰當的順序返回列表中的全部元素。對象

返回的數組是安全的,由於它的引用不是由該列表維護的。也就是說,該方法必須申請一個新的數組,即便list自己就是基於數組的。所以,調用者能夠自由地修改返回的數組。blog

該方法做爲一個橋樑,創建起基於數組和基於集合的API。繼承

  • <T> T[] toArray(T[] a);

返回數組的運行時類型是指定的數組類型。接口

若是列表剛好是該類型的,就會直接返回。不然,必須申請一個新數組,新數組的大小剛好就是列表的size。

若是列表是指定類型的,而且數組中還有剩餘空間,則未使用的數組位置所有置null。——這一點頗有用,由於能夠判斷列表的長度。前提是調用者知道該list不會包含任何null元素。

  • boolean add(E e);

支持該操做的List,可能會限制容許加入該list的元素。好比,有些list可能會拒絕添加null做爲元素,而其餘list有可能限制元素的類型。

UnsupportedOperationException, 若是該List不支持add方法。

ClassCastException, 指定元素的類class,不容許它被添加到該list中。

NullPointerException,若是指定元素是null,而且該List不容許null元素。

IllegalArgumentException,若是該元素的某些屬性,不容許它被添加到該list中。

  • boolean remove(Object o);

刪除第一次出現的那個元素,即下標最小的: o==null ? get(i )==null : o.eqauls(get(i );

若是列表中不包含這樣的元素,就不變。

ClassCastException,若是指定元素的類型沒法與list匹配。

NullPointerException, 若是指定元素是null,而且list不容許null元素。

UnsupportedOperationException,list不支持remove方法。

  • boolean containsAll(Collection<?> c);

若是列表中包含了指定collection中的全部元素,返回true。

ClassCastException,若是指定collection中的一個或多個元素的類型與該list不匹配

NullPointerException,指定collection中包含一個或多個null,而list不容許null元素。

  • boolean addAll(Collection<? extends E> c);

UnsupportedOperationException

ClassCastException

NullPointerException

IllegalArgumentException

  • boolean addAll(int index, Collection<? extends E> c);

在指定的下標處插入指定collection中的全部元素。

IndexOutOfBoundsException,若是下標超出範圍。

  • boolean removeAll(Collection<?> c);

刪除list中全部在c中出現的元素。

  • boolean retainAll(Collection<?> c);

保留指定集合中出現的全部元素。

NullPointerException, 若是list中包含一個null,而指定的collection是不容許null的時候。

ClassCastException

  • void clear();
  • boolean equals(Object o);

兩個list相等的條件是:他們包含相同的元素,以相同的順序。

  • int hashCode();

image

  • E get(int index);
  • E set(int index, E element); //替換已有下標處的元素
  • void add(int index, E element);
  • E remove(int index);
  • int indexOf(Object o);

若是存在,就返回第一次出現的下標。若是不存在,返回-1.

  • int lastIndexOf(Object o);
  • ListIterator<E> listIterator();
  • ListIterator<E> listIterator(int index); //從指定的下標開始遍歷
  • List<E> subList(int fromIndex, int toIndex);

返回一個視圖。包含左下標,不包含右下標。

返回的List是基於原list的,因此在返回的list中進行的非結構性修改會在原list中體現,反之亦然。

任何針對局部範圍list的操做,均可以經過傳遞一個subList視圖來表明整個list。例如,下列語句刪除了list中的部分元素:

list.subList(from, to).clear();

ArrayList

List接口的一種可調整大小的基於數組的實現。實現了全部可選的list操做,也容許全部元素,包括null。

另外,該類還提供了操縱底層實現數組的大小的方法。

該類和Vector類基本是同樣的,除了ArrayList是非同步的。

以常數時間運行的方法:size, isEmpty, get, set, iterator, listIterator。攤銷的常數時間,即O(n ):add。粗略來講,其餘方法的運行時間都是線性的。常數因子比起LinkedList要小。

每一個ArrayList的實例都有一個容量capacity。這是底層數組的大小。一般,容量至少要和List的大小同樣大。由於增長一個元素有常數的攤銷時間,因此沒有明確規定增加策略的細節。

在增長大量元素以前擴容的一個辦法是使用ensureCapacity操做,這能夠減小容量調整的次數。

注意ArrayList是非同步的。若是多線程同時訪問同一個ArrayList實例,而且至少有一個線程修改了列表結構,就必需要有外部的同步機制。一般經過同步某些封裝了該list的對象來實現,若是沒有這樣的對象,該list就應該使用Collections.synchronizedList()來包裝。最好在建立時就這樣作,能夠避免對該list的意外的非同步訪問。(結構性修改是指,增長或刪除一個或多個元素,或者調整了底層數組的大小,只修改了元素的值不是結構性修改)。

ArrayList中的iterator()方法和listIterator()返回的迭代器都是快速失敗的。若是在建立了該迭代器以後的任意時間對list進行告終構性修改,除了經過iterator自己提供的方法以外,該Iterator都會拋出一個ConcurrentModificationException異常。面對同時發生的修改,iterator會快速乾脆地失敗,而不是沒法肯定將來的冒險的、非肯定性的行爲。

注意,iterator提供的快速失敗機制並不能保證線程安全。快速失敗機制應該只用於檢測bug。

AbstractList源碼

抽象類實現了部分方法。

image

 

ArrayList源碼細節

ArrayList繼承自AbstractList抽象類。

成員變量

image

 

構造方法

image

 

get()方法

image

image

image

 

set()方法

image

 

add()方法

image

image

 

擴容

image

 

contains()方法

image

 

remove()方法

image

 

clear()方法

image

 

clone()方法

image

 

轉換爲數組

image

 

迭代器 iterator 和 listIterator

image

image

image

image

【關於Itr中的remove()方法】

注意到lastRet表示上一次讀取的位置,當這個位置爲-1時,remove方法拋出IllegalStateException。而這個位置 爲-1的狀況,一個是初始化時,還未調用過next(),另外一個是在調用了remove()方法後。因此,在這兩種狀況下是不能調用remove()方法的,即remove()方法不能連續調用,必須和next()結合,先next()後remove()。

另外,在刪除元素時,會同步更新iterator中的expectedModCount,這樣保持和List中的modCount的一致,從而使得checkForComodification()檢測經過,本質上並非線程同步的,當多個Iterator同時訪問同一個List時,仍然是不安全的。

image

image

【ListItr】

在Itr的基礎上,增長了向前遍歷的方法,至關於一個雙向遍歷器。還增長了set()和add()方法,使得遍歷器不只能夠刪除元素,還能夠修改和增長元素。

特別注意的,add()方法和remove()方法都會修改lastRet值爲-1,所以須要讀取lastRet的方法,譬如set(),remove()都不能在這兩個方法後面調用,須要先調用一次next()方法。

List的add()和remove()方法都是結構性的修改,因此迭代器中的add()和remove()方法須要同步更新modCount的值,不然會在下一次增刪改查操做時,檢測到不相同,而拋出ConcurrentModificationException。

 

子列表視圖

image

image

image

相關文章
相關標籤/搜索