LinkedList類php
因爲基於數組的鏈表有一個大的缺點,那就是從鏈表中間移除一個元素時須要將此元素後面的全部元素向前移動,會產生大量的開銷,一樣的在鏈表中間插入一個新元素也會有大量開銷。以下圖:css
Linkedlist因爲其實現方式使用的是指針,或者說是引用,那麼就不存在arraylist那種插入或者移除一個元素時的大開銷狀況了:html
固然,LinkedList與ArrayList都是保持元素順序的,調用add的前後順序決定了最終遍歷的順序:java
List<String> staff = new LinkedList<>(); staff.add("Amy"); staff.add("Bob"); staff.add("Carl"); ListIterator<String> iter = staff.listIterator(); iter.next(); // skip past first element iter.add("Juliet");
LinkedList與ArrayList提供listIterator方法,返回一個實現了ListIterator接口的對象,此接口提供了Iterator接口一些沒有的功能,是爲鏈表定製的遍歷器:node
當屢次調用add方法後,元素會被按順序加到當前遍歷器位置以前:nginx
當剛剛調用完listIterator後沒有調用next,直接調用add方法後,新加入的元素會插入到第一個位置,做爲list的頭結點;
當一直調用next方法,直到hasNext方法返回false,也就是到達list尾部時,在這是調用add方法將新加入的元素做爲list的最後結點,即新的尾結點。
當list中存在n個元素時,那麼就會有n+1個空位能夠插入新的結點,以下面的list有A、B、C三個元素:git
|ABC A|BC AB|C ABC|
分別對應上面4個空位點能夠插入新的元素。github
listIterator中還包含一個set方法,它會替換剛剛由next或者previous返回的元素,也就是遍歷器剛剛通過的那個元素:web
ListIterator<String> iter = list.listIterator(); String oldValue = iter.next(); // returns first element iter.set(newValue); // sets first element to newValue
當有兩個iterator同時在操做一個list的時候,就有可能產生衝突。好比一個iterator在刪除元素,另外一個再讀取元素。list自己能夠檢查到這種狀況,若是有多於一個iterator在操做list,就會拋出ConcurrentModificationException異常。以下代碼:ajax
List<String> list = . . .; ListIterator<String> iter1 = list.listIterator(); ListIterator<String> iter2 = list.listIterator(); iter1.next(); iter1.remove(); iter2.next(); // throws ConcurrentModificationException
LinkedList是不支持快速隨機訪問的,若是須要獲取第n個元素,那麼惟一的方法就是從LinkedList的第一個節點開始遍歷,固然,這樣很費時間,因此當須要相似獲取第n個元素的操做時,不要使用LinkedList。
使用LinkedList的惟一緣由是其可以快速的進行插入與刪除操做,而不損耗時間,若是你只有少許的元素進行存儲,仍是選擇arraylist吧。
建議遠離LinkedList中使用integer index去獲取和操做list的全部方法,若是須要隨機訪問集合,請使用arrayList。
List實現了兩種訪問方式,一種是經過iterator從頭訪問到尾, 一種是經過get和set方法直接訪問list中的元素。linkedlist屬於前者,arraylist屬於後者。ArrayList內部封裝了一個能夠動態改變大小的數組。Vector與ArrayList的不一樣在於Vector是線程安全的,多個線程同時操做時安全的。而ArrayList則不是。固然Vector爲了維持多線程同步安全,犧牲了部分性能。