1.集合 Collection
Collection是最基本的集合接口,一個Collection代表一組Object,即Collection的元素(Elements)。一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接繼承自Collection的類,Java SDK提供的類都是繼承自Collection的“子接口”如List和Set。(這段話是抄來的)
咳咳,大體的意思的就是Collection是所有List的國際標準了,那我們可以看一下Collection接口需要記一下的方法。
iterator()
這個方法是用來遍歷Collection中所有的元素的,用法如下:
Iterator it = collection.iterator();
while(it.hasNext()){
Object ob = it.next();
}
這個可以遍歷出一個Collection中所有的元素。
- Iterator 迭代器的作用就是遍歷Collection,Iterator接口里面規(guī)定了三個方法,hasNext()、next()、remove()。看方法名就知道他們的功能了。
- 在Iterator出現(xiàn)之前,也就是Java1.0版本的時候,遍歷還是用的Enumeration這個枚舉類,后來Iterator出來之后就取代了Enumeration。
- Iterator支持fail-fast機制,直白的理解就是快速錯誤,就是相當于一種報錯機制,當遍歷的集合發(fā)生了結構性的修改的時候就會發(fā)生fail-fast.而真正實現(xiàn)檢測結構性修改的原因就是在集合中增加一個modcount成員變量,當每次對集合進行add或者remove的時候我們就進行modcount++操作。
List接口
List接口是有序的Collection接口的實現(xiàn)。此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下標)來訪問List中的元素,類似于Java的數(shù)組。
順序是 List 重要的特性;它可保證元素按照規(guī)定的順序排列。
List 為 Collection 添加了大量方法,以便我們在 List 中部插入和刪除元素(只推薦對 LinkedList 這樣做)。List 也會生成一個 ListIterator(列表反復器),利用它可在一個列表里朝兩個方向遍歷,同時插入和刪除位于列表中部的元素(同樣地,只建議對 LinkedList 這樣做)
ArrayList 由一個數(shù)組后推得到的 List。作為一個常規(guī)用途的對象容器使用,用于替換原先的 Vector。允許我們快速訪問元素,但在從列表中部插入和刪除元素時,速度卻嫌稍慢。一般只應該用 ListIterator 對一個 ArrayList 進行向前和向后遍歷,不要用它刪除和插入元素;與 LinkedList 相比,它的效率要低許多
LinkedList 提供優(yōu)化的順序訪問性能,同時可以高效率地在列表中部進行插入和刪除操作。但在進行隨機訪問時,速度卻相當慢,此時應換用 ArrayList。也提供了 addFirst(),addLast(),getFirst(),getLast(),removeFirst()以及 removeLast() (未在任何接口或基礎類中定義),以便將其作為一個規(guī)格、隊列以及一個雙向隊列使用
LinkedList
LinkedList實現(xiàn)了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在 LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。
注意LinkedList沒有同步方法。如果多個線程同時訪問一個List,則必須自己實現(xiàn)訪問同步。一種解決方法是在創(chuàng)建List時構造一個同步的List:
List list = Collections.synchronizedList(newLinkedList(...));ArrayList
ArrayList實現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括null。ArrayList沒有同步。size,isEmpty,get,set方法運行時間為常數(shù)。但是add方法開銷為分攤的常數(shù),添加n個元素需要O(n)的時間。其他的方法運行時間為線性。 每個ArrayList實例都有一個容量(Capacity),即用于存儲元素的數(shù)組的大小。這個容量可隨著不斷添加新元素而自動增加,但是增長算法并沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。 和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。Vector
Vector非常類似ArrayList,但是Vector是同步的。由Vector創(chuàng)建的Iterator,雖然和 ArrayList創(chuàng)建的Iterator是同一接口,但是,因為Vector是同步的,當一個Iterator被創(chuàng)建而且正在被使用,另一個線程改變了 Vector的狀態(tài)(例如,添加或刪除了一些元素),這時調用Iterator的方法時將拋出 ConcurrentModificationException,因此必須捕獲該異常。
Stack
Stack繼承自Vector,實現(xiàn)一個后進先出的堆棧。Stack提供5個額外的方法使得Vector得以被當作堆棧使用。基本的push和pop 方法,還有peek方法得到棧頂?shù)脑兀琫mpty方法堆棧是否為空,search方法檢測一個元素在堆棧中的位置。Stack剛創(chuàng)建后是空棧。Tips
需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。
如果程序在單線程環(huán)境中,或者訪問僅僅在一個線程中進行,考慮非同步的類,其效率較高,如果多個線程可能同時操作一個類,應該使用同步的類。盡量返回接口而非實際的類型,如返回List而非ArrayList,這樣如果以后需要將ArrayList換成LinkedList時,代碼不用改變。
arraylist和linkedlist
- ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結構,LinkedList基于鏈表的數(shù)據(jù)結構。
- 對于隨機訪問get和set,ArrayList覺得優(yōu)于LinkedList,因為LinkedList要移動指針
- 對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因為ArrayList要移動數(shù)據(jù)。 這一點要看實際情況的。若只對單條數(shù)據(jù)插入或刪除,ArrayList的速度反而優(yōu)于LinkedList。但若是批量隨機的插入刪除數(shù)據(jù),LinkedList的速度大大優(yōu)于ArrayList. 因為ArrayList每插入一條數(shù)據(jù),要移動插入點及之后的所有數(shù)據(jù)。
Vector和ArrayList
- vector是線程同步的,所以它也是線程安全的,而arraylist是線程異步的,是不安全的。如果不考慮到線程的安全因素,一般用arraylist效率比較高。
- 如果集合中的元素的數(shù)目大于目前集合數(shù)組的長度時,vector增長率為目前數(shù)組長度的100%,而arraylist增長率為目前數(shù)組長度的50%.如過在集合中使用數(shù)據(jù)量比較大的數(shù)據(jù),用vector有一定的優(yōu)勢。
- 如果查找一個指定位置的數(shù)據(jù),vector和arraylist使用的時間是相同的,都是0(1),這個時候使用vector和arraylist都可以。而如果移動一個指定位置的數(shù)據(jù)花費的時間為0(n-i)n為總長度,這個時候就應該考慮到使用linklist,因為它移動一個指定位置的數(shù)據(jù)
所花費的時間為0(1),而查詢一個指定位置的數(shù)據(jù)時花費的時間為0(i)。
- ArrayList 和Vector是采用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便增加和插入元素,都允許直接序號索引元素,但是插入數(shù)據(jù)要設計到數(shù)組元素移動等內存操作,所以索引數(shù)據(jù)快插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全)所以性能上比ArrayList要差,LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進行向前或向后遍歷,但是插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入數(shù)度較快!