1. 程式人生 > >java基礎鞏固系列(九):持有物件之間的使用與關係(Iterable、Collection、List、Queue、Set、Map、Stack)

java基礎鞏固系列(九):持有物件之間的使用與關係(Iterable、Collection、List、Queue、Set、Map、Stack)

總:Java提供了一套比較完整的容器類,基本型別是:List、Set、Queue、Map,這些物件型別稱為集合類。

一、介面繼承關係:


Iterable介面,在java.lang包中,Collection、List、Queue、Set介面繼承Iterable介面


可以看出來,List、Queue、Set這三個介面是在java.util包中,繼承自Collection介面


Map介面不繼承Collection介面,也不繼承其它介面

二、Iterable與Iterator的關係

Iterable屬於java.lang包,Iterator屬於java.util包。

下面,我們先看看Iterable這個介面的api文件的解釋:


List、Map、Set、Collection都繼承了Iterator介面,這個介面定義了Iterator<T> iterator()方法,在繼承這個介面後就能夠使用Iterator迭代器了

問題:為什麼一定要實現Iterable介面,為什麼不直接實現Iterator介面呢? (來自:http://liuyun025.iteye.com/blog/1321045 

      看一下JDK中的集合類,比如List一族或者Set一族,都是實現了Iterable介面,但並不直接實現Iterator介面。 
仔細想一下這麼做是有道理的。 

      因為Iterator介面的核心方法next()或者hasNext() 是依賴於迭代器的當前迭代位置的。 


      如果Collection直接實現Iterator介面,勢必導致集合物件中包含當前迭代位置的資料(指標)。 
      當集合在不同方法間被傳遞時,由於當前迭代位置不可預置,那麼next()方法的結果會變成不可預知。 
      除非再為Iterator介面新增一個reset()方法,用來重置當前迭代位置。 
      但即時這樣,Collection也只能同時存在一個當前迭代位置。 
      而Iterable則不然,每次呼叫都會返回一個從頭開始計數的迭代器。 
      多個迭代器是互不干擾的。 

三、Collection介面與Collections類之間的關係,以及Arrays類

下面,看一個程式:

public static void main(String[] args) {
		//(1)
		List<Integer> list = Arrays.asList(1,2,3,4);
		//(2)
		Collection<Integer> c = 
			new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
		//(3)
		Integer[] moreInts = {6,7,8,9,10};
		c.addAll(Arrays.asList(moreInts));
		//(4)
		Collections.addAll(c, 11,12,13,14,15);
		Collections.addAll(c, moreInts);	
			
	}
(1)Arrays類包含運算元組的各種方法,包含有很多的static方法,Arrays.asList(T t)返回List<T>集合獨享

(2)通過ArrayList向上轉型成為Collection物件

(3)通過Collection物件的addAll方法把陣列新增到Collection物件c中

(4)通過Collections類的靜態方法addAll(Collection<T> c,T....elements),把引數表中後邊的可變引數新增到Collection物件中

四、List(列表)

List列表的特徵是以線性的方式儲存,允許儲存重複的物件

List實現的主要類有三個:

(1)ArrayList:提供了一種可增長陣列的實現,優點是隨機訪問(set()和get())比較快,缺點是插入、刪除中間項速度比較慢。

(2)LinkedList:提供了雙鏈表的實現(是基於連結串列的),對於資料的插入和刪除需要的開銷比較小

(3)Vector:Vector 類可以實現可增長的物件陣列,與ArrayList相比,ArrayList是非同步的,在涉及到多執行緒的情況下需要使用Vector(在以後的多執行緒問題中會繼續講到)

五、Set(一個不包含重複元素的 collection)

Set集合中不允許儲存重複的物件,集合中的物件不按特定的方式排序

Set介面主要實現了兩個類:

(1)HashSet:此類是基於雜湊表支援的,是不同步的,天生就是用來提高查詢速率的。存入HashSet的物件必須定義hashCode()

(2)TreeSet:基於二叉樹的實現,儲存次序的Set, 底層為樹結構。使用它可以從Set中提取有序的序列。 

六、Map(對映)

Map 是一種把鍵物件和值物件對映的集合,它的每一個元素都包含一對鍵物件和值物件。 Map沒有繼承於Collection介面 從Map集合中檢索元素時,只要給出鍵物件,就會返回對應的值物件。 

Map主要有兩個實現類:

HashMap:Map基於散列表的實現。插入和查詢“鍵值對”的開銷是固定的。可以通過構造器設定容量capacity和負載因子load factor,以調整容器的效能。 

TreeMap:基於紅黑樹資料結構的實現。檢視“鍵”或“鍵值對”時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特點在 於,你得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹