與Set不一樣, List容許重複的元素。即 e1.equals(e2)。數組
返回列表中元素的個數,若是超過Integer.MAX_VALUE,就返回Integer.MAX_VALUE安全
對於目標元素o, 若是列表中至少存在一個元素e:o==null? e==null ; o.eqauls(e)。多線程
若是目標元素不可比較,將會拋出異常:ClassCastException.線程
若是目標元素爲null,而且該列表不容許null元素,則拋出異常:NullPointerException.3d
以恰當的順序返回列表中的全部元素。對象
返回的數組是安全的,由於它的引用不是由該列表維護的。也就是說,該方法必須申請一個新的數組,即便list自己就是基於數組的。所以,調用者能夠自由地修改返回的數組。blog
該方法做爲一個橋樑,創建起基於數組和基於集合的API。繼承
返回數組的運行時類型是指定的數組類型。接口
若是列表剛好是該類型的,就會直接返回。不然,必須申請一個新數組,新數組的大小剛好就是列表的size。
若是列表是指定類型的,而且數組中還有剩餘空間,則未使用的數組位置所有置null。——這一點頗有用,由於能夠判斷列表的長度。前提是調用者知道該list不會包含任何null元素。
支持該操做的List,可能會限制容許加入該list的元素。好比,有些list可能會拒絕添加null做爲元素,而其餘list有可能限制元素的類型。
UnsupportedOperationException, 若是該List不支持add方法。
ClassCastException, 指定元素的類class,不容許它被添加到該list中。
NullPointerException,若是指定元素是null,而且該List不容許null元素。
IllegalArgumentException,若是該元素的某些屬性,不容許它被添加到該list中。
刪除第一次出現的那個元素,即下標最小的: o==null ? get(i )==null : o.eqauls(get(i );
若是列表中不包含這樣的元素,就不變。
ClassCastException,若是指定元素的類型沒法與list匹配。
NullPointerException, 若是指定元素是null,而且list不容許null元素。
UnsupportedOperationException,list不支持remove方法。
若是列表中包含了指定collection中的全部元素,返回true。
ClassCastException,若是指定collection中的一個或多個元素的類型與該list不匹配
NullPointerException,指定collection中包含一個或多個null,而list不容許null元素。
UnsupportedOperationException
ClassCastException
NullPointerException
IllegalArgumentException
在指定的下標處插入指定collection中的全部元素。
IndexOutOfBoundsException,若是下標超出範圍。
刪除list中全部在c中出現的元素。
保留指定集合中出現的全部元素。
NullPointerException, 若是list中包含一個null,而指定的collection是不容許null的時候。
ClassCastException
兩個list相等的條件是:他們包含相同的元素,以相同的順序。
若是存在,就返回第一次出現的下標。若是不存在,返回-1.
返回一個視圖。包含左下標,不包含右下標。
返回的List是基於原list的,因此在返回的list中進行的非結構性修改會在原list中體現,反之亦然。
任何針對局部範圍list的操做,均可以經過傳遞一個subList視圖來表明整個list。例如,下列語句刪除了list中的部分元素:
list.subList(from, to).clear();
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。
抽象類實現了部分方法。
ArrayList繼承自AbstractList抽象類。
注意到lastRet表示上一次讀取的位置,當這個位置爲-1時,remove方法拋出IllegalStateException。而這個位置 爲-1的狀況,一個是初始化時,還未調用過next(),另外一個是在調用了remove()方法後。因此,在這兩種狀況下是不能調用remove()方法的,即remove()方法不能連續調用,必須和next()結合,先next()後remove()。
另外,在刪除元素時,會同步更新iterator中的expectedModCount,這樣保持和List中的modCount的一致,從而使得checkForComodification()檢測經過,本質上並非線程同步的,當多個Iterator同時訪問同一個List時,仍然是不安全的。
在Itr的基礎上,增長了向前遍歷的方法,至關於一個雙向遍歷器。還增長了set()和add()方法,使得遍歷器不只能夠刪除元素,還能夠修改和增長元素。
特別注意的,add()方法和remove()方法都會修改lastRet值爲-1,所以須要讀取lastRet的方法,譬如set(),remove()都不能在這兩個方法後面調用,須要先調用一次next()方法。
List的add()和remove()方法都是結構性的修改,因此迭代器中的add()和remove()方法須要同步更新modCount的值,不然會在下一次增刪改查操做時,檢測到不相同,而拋出ConcurrentModificationException。