Java 集合類詳解 Java 集合類詳解
Java 集合類詳解
0.參考文獻
http://blog.csdn.net/liulin_good/article/details/6213815
1.java集合類圖
1.1
1.2
上述類圖中,實線邊框的是實現類,比如ArrayList,LinkedList,HashMap等,折線邊框的是抽象類,比如AbstractCollection,AbstractList,AbstractMap等,而點線邊框的是介面,比如Collection,Iterator,List等。
發現一個特點,上述所有的集合類,都實現了Iterator介面,這是一個用於遍歷集合中元素的介面,主要包含hashNext(),next(),remove()三種方法。它的一個子介面LinkedIterator在它的基礎上又添加了三種方法,分別是add(),previous(),hasPrevious()。也就是說如果是先Iterator介面,那麼在遍歷集合中元素的時候,只能往後遍歷,被遍歷後的元素不會在遍歷到,通常無序集合實現的都是這個介面,比如HashSet,HashMap;而那些元素有序的集合,實現的一般都是LinkedIterator介面,實現這個介面的集合可以雙向遍歷,既可以通過next()訪問下一個元素,又可以通過previous()訪問前一個元素,比如ArrayList。
還有一個特點就是抽象類的使用。如果要自己實現一個集合類,去實現那些抽象的介面會非常麻煩,工作量很大。這個時候就可以使用抽象類,這些抽象類中給我們提供了許多現成的實現,我們只需要根據自己的需求重寫一些方法或者新增一些方法就可以實現自己需要的集合類,工作流昂大大降低。
1.3
2.詳解
2.1HashSet
HashSet是Set介面的一個子類,主要的特點是:裡面不能存放重複元素,而且採用雜湊的儲存方法,所以沒有順序。這裡所說的沒有順序是指:元素插入的順序與輸出的順序不一致。
程式碼例項:HashSetDemo
View Code程式碼例項:SetTest
View Code
2.2ArrayList
ArrayList是List的子類,它和HashSet想法,允許存放重複元素,因此有序。集合中元素被訪問的順序取決於集合的型別。如果對ArrayList進行訪問,迭代器將從索引0開始,每迭代一次,索引值加1。然而,如果訪問HashSet中的元素,每個元素將會按照某種隨機的次序出現。雖然可以確定在迭代過程中能夠遍歷到集合中的所有元素,但卻無法預知元素被訪問的次序。
程式碼例項:ArrayListDemo
View Code2.3 ListIterator
ListIterator是一種可以在任何位置進行高效地插入和刪除操作的有序序列。
程式碼例項:LinkedListTest
View Code2.4HashMap
參考之前的一篇部落格:Hashmap實現原理
2.5WeekHashMapDemo
View Code輸出結果
View Code疑問:為什麼value沒有被回收。
3.比較
是否有序 | 是否允許元素重複 | ||
Collection | 否 | 是 | |
List | 是 | 是 | |
Set | AbstractSet | 否 | 否 |
HashSet | |||
TreeSet | 是(用二叉排序樹) | ||
Map | AbstractMap | 否 | 使用key-value來對映和儲存資料,key必須唯一,value可以重複 |
HashMap | |||
TreeMap | 是(用二叉排序樹) |
作者: xwdreamer 出處: http://www.cnblogs.com/xwdreamer 歡迎任何形式的轉載,但請務必註明出處。
0.參考文獻
http://blog.csdn.net/liulin_good/article/details/6213815
1.java集合類圖
1.1
1.2
上述類圖中,實線邊框的是實現類,比如ArrayList,LinkedList,HashMap等,折線邊框的是抽象類,比如AbstractCollection,AbstractList,AbstractMap等,而點線邊框的是介面,比如Collection,Iterator,List等。
發現一個特點,上述所有的集合類,都實現了Iterator介面,這是一個用於遍歷集合中元素的介面,主要包含hashNext(),next(),remove()三種方法。它的一個子介面LinkedIterator在它的基礎上又添加了三種方法,分別是add(),previous(),hasPrevious()。也就是說如果是先Iterator介面,那麼在遍歷集合中元素的時候,只能往後遍歷,被遍歷後的元素不會在遍歷到,通常無序集合實現的都是這個介面,比如HashSet,HashMap;而那些元素有序的集合,實現的一般都是LinkedIterator介面,實現這個介面的集合可以雙向遍歷,既可以通過next()訪問下一個元素,又可以通過previous()訪問前一個元素,比如ArrayList。
還有一個特點就是抽象類的使用。如果要自己實現一個集合類,去實現那些抽象的介面會非常麻煩,工作量很大。這個時候就可以使用抽象類,這些抽象類中給我們提供了許多現成的實現,我們只需要根據自己的需求重寫一些方法或者新增一些方法就可以實現自己需要的集合類,工作流昂大大降低。
1.3
2.詳解
2.1HashSet
HashSet是Set介面的一個子類,主要的特點是:裡面不能存放重複元素,而且採用雜湊的儲存方法,所以沒有順序。這裡所說的沒有順序是指:元素插入的順序與輸出的順序不一致。
程式碼例項:HashSetDemo
View Code程式碼例項:SetTest
View Code
2.2ArrayList
ArrayList是List的子類,它和HashSet想法,允許存放重複元素,因此有序。集合中元素被訪問的順序取決於集合的型別。如果對ArrayList進行訪問,迭代器將從索引0開始,每迭代一次,索引值加1。然而,如果訪問HashSet中的元素,每個元素將會按照某種隨機的次序出現。雖然可以確定在迭代過程中能夠遍歷到集合中的所有元素,但卻無法預知元素被訪問的次序。
程式碼例項:ArrayListDemo
View Code2.3 ListIterator
ListIterator是一種可以在任何位置進行高效地插入和刪除操作的有序序列。
程式碼例項:LinkedListTest
View Code2.4HashMap
參考之前的一篇部落格:Hashmap實現原理
2.5WeekHashMapDemo
View Code輸出結果
View Code疑問:為什麼value沒有被回收。
3.比較
是否有序 | 是否允許元素重複 | ||
Collection | 否 | 是 | |
List | 是 | 是 | |
Set | AbstractSet | 否 | 否 |
HashSet | |||
TreeSet | 是(用二叉排序樹) | ||
Map | AbstractMap | 否 | 使用key-value來對映和儲存資料,key必須唯一,value可以重複 |
HashMap | |||
TreeMap | 是(用二叉排序樹) |