Java基礎:容器,java基礎容器
轉載請註明出處:jiq•欽's technical Blog
一、Collection:存放獨立元素
Collection中的介面都是可選操作,其實作類別 並不一定實現了其所有介面,這是為了防止“介面爆炸”。最常見的Unsupported Operation都源自於背後由固定尺寸的資料結構支援的容器,比如使用ArrayList.asList將數群組轉換成List的時候,就會得到這樣的容器。
(1)Collection之List
List較之Collection增加了很多額外的介面。特別是LinkedList。
|
|
優點 |
缺點 |
儲存元素的順序 |
應用 |
|
ArrayList |
隨機訪問速度快,內部使用數組實現。 |
迭代,插入和刪除元素慢,尤其是當List]尺寸比較大的時候。 |
插入順序 |
可變長數組 |
|
LinkedList |
迭代(順序訪問經過最佳化),插入,刪除都很快
內部使用雙向鏈表實現 |
隨機訪問速度慢 |
插入順序 |
順序訪問, 批量插入刪除元素的場合 |
(2)Collection之Set
存入Set的每一個元素都必須是唯一的,因為Set不儲存重複元素,但是存入Set的元素必須要定義equals()方法以確保對象的惟一性。另外Set與Collection有著完全相同的介面,Set並不保證維護元素的次序。所以需要注意,Set不包含隨機訪問的get方法,因為Set是自己維護內部順序的,不需要隨機訪問。
|
|
優點 |
儲存元素的順序 |
要求 |
|
HashSet |
為快速尋找設計 |
散列儲存 |
必須定義hashCode()方法 |
|
LinkedHashSet |
和HashSet一樣的查詢速度,但是插入要比HashSet慢一些,因為它通過維護鏈表形式維護元素。 |
使用鏈表維護元素順序(插入順序) |
必須定義hashCode()方法 |
|
TreeSet |
儲存有序的Set,底層通過TreeMap來實現的 |
按照排序次序維護元素 |
必須實現Comparable介面(包含compareTo方法) |
注意,如果沒有特別的限制,HashSet就應該是你的預設選擇,因為它對速度進行了最佳化。
(3)Collection之Queue:
|
|
特點 |
儲存元素的順序 |
|
LinkedList |
LinkedList除了普通List之外,還添加了很多實現<隊列,棧,雙向隊列>三種資料結構的方法。
尤其是類比Queue的時候在兩端插入刪除元素很快(經過了最佳化)。 |
插入的順序 |
|
PriorityQueue |
按照排序次序取出元素,所以要求必須實現Comparable介面。 |
排序次序 |
二、Map:存放鍵-值對
為了保證Map中的唯一性,任何“鍵”都需要有一個equals()方法,判斷當前鍵是否與表中的鍵相同。
|
|
特點 |
儲存元素的順序 |
要求 |
|
HashMap |
Map基於散列儲存,插入和查詢“鍵值對”的開銷是固定的。 |
散列儲存 |
存入的鍵需要具備hashCode()方法,當然,返回的標識不一定要唯一 |
|
LinkedHashMap |
為了提高速度散列了所有元素,插入查詢只比HashMap慢一點點,因為它在維護散列資料結構的同時還要維護鏈表(插入順序)。 但是迭代訪問的時候更快,因為內部使用鏈表維護次序。 |
插入順序 |
同樣需要鍵實現hashCode()方法 |
|
TreeMap |
Map基於紅/黑樹狀結構的實現。所以所得的結果是經過排序的。 |
紅/黑樹狀結構 |
為了排序,必須實現Comparable介面。 |
其他為解決特殊問題設計的Map還有IdentityHashMap,WeakHashMap,ConcurrentHashMap等。
實驗證明,除了IdentityHashMap之外的其他所有Map,隨著Map的尺寸變大,插入會明顯變慢,但是尋找的代價小很多。我猜測這是由於每次插入都要通過equals方法來確保鍵值的唯一性導致的,不過Map最常用的操作是查詢操作,所以情況還比較樂觀。
總結:
(1)要想讓你的容器型別安全,需要使用泛型(否則編譯器允許你向容器中插入各種不同類型,只要是Object即可);
(2)建立容器的時候盡量將其向上轉型為介面,像這樣:
List<Apple> apples = newArrayList<Apple>();
使用介面的目的在於當你決定修改你的實現的時候,只需要在建立的地方修改它就可以了。
(3)Java有大量的用於容器的卓越的方法,他們被封裝到java.util.Collections類中,全部都是static方法。比如Collections類中有unmodifiableMap/List/Set()方法設定Collection和Map為不可修改,還有synchronizedCollection/List/Set/Map等方法同步整個容器。另外排序,填充,逆置,最大最小值等很多方法也可以找到。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。