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,它可以返回一個子樹












發佈了149 篇原創文章 · 獲贊 25 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章