Java常用集合類及其區別
面試時時被集合類各種虐,現在就來總結一下Java的集合類及其區別。
Java集合框架的基本介面、類層級結果如下:
java.util.Collection[介面]
--java.util.List[介面]
--java.util.AarrayList
--java.util.LinkedList
--java.util.Vector
--java.util.Stack
--java.util.Set[介面]
--java.util.HashSet
--java.util.SortedSet[介面]
--java.util.TreeSet
--java.util.Queue
java.util.Map[介面]
--java.util.SortedMap[介面]
--java.util.TreeMap
--java.util.HashMap
--java.util.HashTable
--java.util.LinkedHashMap
--java.util.WeakHashMap
1.Collection
是最基本的集合型別,所有實現Collection介面的類都必須提供兩個標準的建構函式:無引數的建構函式用於建立一個共的Collection,有一個Collection引數的建構函式用於建立一個新的Collection,這個新的Collection與傳入的Collection有相同的元素。
若要檢查Collection中的元素,可以使用foreach進行遍歷,也可以使用迭代器,Collection支援iterator()方法,通過該方法可以訪問Collection中的每一個元素。用法如下:
Iterator it=collection.iterator();
while(it.hasNext()){
Object obj=it.next();
}
Set和List是由Collection派生的兩個介面1.1 List介面
List是有序的Collection,使用此介面能夠精確的控制每個元素插入的位置。使用者能夠使用索引的位置來訪問List中的元素,類似於Java陣列。 List允許有相同的元素存在。 除了具有Collection介面必備的的iterator()方法外,還提供了listIterator()方法,放回一個 ListIterator介面。實現List介面的常用類有LinkedList、ArrayList、Vector和Stack
1.1.1 LinkedList類
LinkedList實現了List類介面,允許null元素。此外LinkedList提供額外的get、remove、insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆疊(stack),佇列(queue)或雙向佇列(deque) LinkedList沒有同步方法。如果多個執行緒想訪問同一個List,則必須自己實現訪問同步。一種解決辦法是在建立List時構造一個同步的List: List list=Collection。synchronizedList(new LinkedList(...))1.1.2 AyyayList類
ArrayList實現了可變大小的陣列。它允許所有元素,包括null。ArrayList沒有同步。 size(),isEmpty(),get(),set()方法執行時間為常數。但是add()方法開銷為分攤的常數,新增n個元素需要O(n)的時間。其他的方法執行時間為線性。 每個ArrayList例項都有一個容量(Capactity),即用於儲存元素的陣列的大小。這個容量可隨著不斷新增新元素而自動增加,但是增長演算法並沒有定義。當需要插入大量元素時,在插入之前可以呼叫ensureCapacity()方法來增加ArrayList容量已提高插入效率1.2Vector類
Vector非常類似ArrayList,當時Vector是同步的。由Vector建立的iterator,雖然和ArrayLsit建立的iterator是同一介面,但是,因為Vector是同步的,當一個iterator被建立而且這在被使用,另一個執行緒改變了Vector狀態,這時呼叫iterator的方法時將丟擲ConcurrentModificationException,因此必須捕獲該異常。1.3 Stack類
Stack繼承自Vector,實現了一個後進先出的堆疊。Stack提供了5個額外的方法使得Vector得以被當做堆疊使用。基本的push和pop方法,還有peek方法得到棧頂的元素,empty方法測試堆疊是否為空,serach方法檢測一個元素在堆疊中的位置。Stack剛建立後是空棧。