Java基礎:容器,java基礎容器

來源:互聯網
上載者:User

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等方法同步整個容器。另外排序,填充,逆置,最大最小值等很多方法也可以找到。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.