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