淺談JAVA集合 Map List Set等java集合類

一、Collections類和Collection接口

   Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。

  Collection是最基本的集合接口,一個Collection代表一組Object,即Collection的元素(Elements)。一些 Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接繼承自Collection的 類,Java SDK提供的類都是繼承自Collection的“子接口”如List和Set。

二、現在來談談Java集合的一些實現類。

Collection

├List

│├ArreyList

│├Vector

│├LinkedList

│└Stack

└Set

│├HashSet

│├LinkedHashSet

│└TreeSet

List代表有序、重複的集合

1.ArrayList類

  ArrayList實現了可變大小的數組。它允許所有元素,包括null。ArrayList沒有同步。

size,isEmpty,get,set方法運行時間爲常數。但是add方法開銷爲分攤的常數,添加n個元素需要O(n)的時間。其他的方法運行時間爲線性。

  每個ArrayList實例都有一個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨着不斷添加新元素而自動增加,但是增長算法 並沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。

  和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。

2.Vector類

  Vector非常類似ArrayList,但是Vector是同步的。由Vector創建的Iterator,雖然和ArrayList創建的Iterator是同一接口,但是,因爲Vector是同步的,當一個Iterator被創建而且正在被使用,另一個線程改變了Vector的狀態(例如,添加或刪除了一些元素),這時調用Iterator的方法時將拋出ConcurrentModificationException,因此必須捕獲該異常。

3.LinkedList類
  LinkedList實現了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在 LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。
  注意LinkedList沒有同步方法。如果多個線程同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在創建List時構造一個同步的List:
    List list = Collections.synchronizedList(new LinkedList(...));

4.Stack 類
  Stack繼承自Vector,實現一個後進先出的堆棧。Stack提供5個額外的方法使得Vector得以被當作堆棧使用。基本的push和pop方法,還有peek方法得到棧頂的元素,empty方法測試堆棧是否爲空,search方法檢測一個元素在堆棧中的位置。Stack剛創建後是空棧。

Set代表無序、不可重複的集合
HashSet和TreeSet的區別
HashSet無序,TreeSet有序,兩者均不能有重複的對象

Map
HashMap

Hashtable

TreeMap
└WeakHashMap

Map沒有繼承Collection接口

1.Hashtable類
  Hashtable繼承Map接口,實現一個key-value映射的哈希表。任何非空(non-null)的對象都可作爲key或者value。Hashtable是同步的。

2.HashMap類
  HashMap和Hashtable類似,不同之處在於 HashMap是非同步的,並且允許null,即null value和null key。,但是將HashMap視爲Collection時 (values()方法可返回Collection),其迭代子操作時間開銷和HashMap的容量成比例。因此,如果迭代操作的性能相當重要的話,不要 將HashMap的初始化容量設得過高,或者load factor過低。

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

三、集合類的遍歷

遍歷通用Collection

Iterator it = collection.iterator(); // 獲得一個迭代子
  while(it.hasNext()) {
   Object obj = it.next(); // 得到下一個元素
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章