1. 程式人生 > >Java常用集合類及其區別

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剛建立後是空棧。

1.4 Set介面

   Set是一種不包含重複元素的Collection,即任意的兩個元素e1和e2都有e1.equals(e2)=false,Set最多有一個null元素。    很明顯,Set的建構函式有一個約束條件,傳入的Collection引數不能包含重複的元素。     請注意:必須小心操作可變物件。如果一個Set中的可變元素改變了自身的狀態導致Object.equals(Object)=true將導致一些問題

1.4.1 HashSet

   HashSet呼叫物件的hashCode(),獲得雜湊碼,然後在集合中計算存放物件的位置。通過比較雜湊碼與equals()方法來判別是否重複。所以,過載了equals()方法同時也要過載hashCode();

1.4.2 TreeSet

TreeSet 繼承SortedSet介面,能夠對集合中物件排序。預設排序方式是自然排序,但該方式只能對實現了Comparable介面的物件排序,java中對Integer、Byte、Double、Character、String等數值型和字元型物件都實現了該介面。


2 Map介面

      Map沒有繼承Collection介面,Map提供key到value的對映。一個Map中不能包含相同的key,每個key只能對映一個value。Map介面提供了3中集合的檢視,Map的內容可以被當作一組key集合,一組value集合,或者一組key--value對映。

2.1 HashTable類

   HashTable繼承Map介面,實現了一個key--value對映的雜湊表。任何非空的物件都可作為key或者value。   新增資料使用put(key,value),取出資料使用get(key),這兩個基本操作的時間開銷為常數。   HashTable通過initial caoacity和load factor兩個引數調整效能。通常預設的load factor 0.75較好地實現了時間和空間的均衡。增大了load factor可以節省空間但相應的查詢時間將增大,這回影響像get和put這樣的操作 HashTable是同步的

2.2 HashMap類

   HashMap和HashTable類似,不同之處在於HashMap是非同步的,並且允許null,即null value和null key,但是將HashMap視為Collection時,其迭子操作時間開銷和HahMap的容量成比例。因此,如果迭代操作的效能相當重要的話,不要將HashMap的初始化容量設的過高,或者load factor過低

2.3 WeakHashMap類

WeakHashMap是一種改進的HashMap,他對key實行弱引用,如果一個key不再被外部所引用,那麼該key可以被GC回收