java提高篇(二十)-----集合大家族

來源:互聯網
上載者:User

標籤:

   在編寫java程式中,我們最常用的除了八種基礎資料型別 (Elementary Data Type),String對象外還有一個集合類,在我們的的程式中到處充斥著集合類的身影!java中集合大家族的成員實在是太豐富了,有常用的ArrayList、HashMap、HashSet,也有不常用的Stack、Queue,有安全執行緒的Vector、HashTable,也有線程不安全的LinkedList、TreeMap等等!

      上面的圖展示了整個集合大家族的成員以及他們之間的關係。下面就上面的各個介面、基類做一些簡單的介紹(主要介紹各個集合的特點。區別),更加詳細的介紹會在不久的將來一一講解。

一、Collection介面

      Collection介面是最基本的集合介面,它不提供直接的實現,Java SDK提供的類都是繼承自Collection的“子介面”如List和Set。Collection所代表的是一種規則,它所包含的元素都必須遵循一條或者多條規則。如有些允許重複而有些則不能重複、有些必須要按照順序插入而有些則是散列,有些支援排序但是有些則不支援。

      在Java中所有實現了Collection介面的類都必須提供兩套標準的建構函式,一個是無參,用於建立一個空的Collection,一個是帶有Collection參數的有參建構函式,用於建立一個新的Collection,這個新的Collection與傳入進來的Collection具備相同的元素。

二、List介面

      List介面為Collection直接介面。List所代表的是有序的Collection,即它用某種特定的插入順序來維護元素順序。使用者可以對列表中每個元素的插入位置進行精確地控制,同時可以根據元素的整數索引(在列表中的位置)訪問元素,並搜尋列表中的元素。實現List介面的集合主要有:ArrayList、LinkedList、Vector、Stack。

2.1、ArrayList

      ArrayList是一個動態數組,也是我們最常用的集合。它允許任何符合規則的元素插入甚至包括null。每一個ArrayList都有一個初始容量(10),該容量代表了數組的大小。隨著容器中的元素不斷增加,容器的大小也會隨著增加。在每次向容器中增加元素的同時都會進行容量檢查,當快溢出時,就會進行擴容操作。所以如果我們明確所插入元素的多少,最好指定一個初始容量值,避免過多的進行擴容操作而浪費時間、效率。

      size、isEmpty、get、set、iterator 和 listIterator 操作都以固定時間運行。add 操作以分攤的固定時間運行,也就是說,添加 n 個元素需要 O(n) 時間(由於要考慮到擴容,所以這不只是添加元素會帶來分攤固定時間開銷那樣簡單)。

      ArrayList擅長於隨機訪問。同時ArrayList是非同步的。

2.2、LinkedList

      同樣實現List介面的LinkedList與ArrayList不同,ArrayList是一個動態數組,而LinkedList是一個雙向鏈表。所以它除了有ArrayList的基本操作方法外還額外提供了get,remove,insert方法在LinkedList的首部或尾部。

      由於實現的方式不同,LinkedList不能隨機訪問,它所有的操作都是要按照雙重鏈表的需要執行。在列表中索引的操作將從開頭或結尾遍曆列表(從靠近指定索引的一端)。這樣做的好處就是可以通過較低的代價在List中進行插入和刪除操作。

      與ArrayList一樣,LinkedList也是非同步的。如果多個線程同時訪問一個List,則必須自己實現訪問同步。一種解決方案是在建立List時構造一個同步的List: 
List list = Collections.synchronizedList(new LinkedList(...));

2.3、Vector

      與ArrayList相似,但是Vector是同步的。所以說Vector是安全執行緒的動態數組。它的操作與ArrayList幾乎一樣。

2.4、Stack

      Stack繼承自Vector,實現一個後進先出的堆棧。Stack提供5個額外的方法使得Vector得以被當作堆棧使用。基本的push和pop 方法,還有peek方法得到棧頂的元素,empty方法測試堆棧是否為空白,search方法檢測一個元素在堆棧中的位置。Stack剛建立後是空棧。

三、Set介面

      Set是一種不包括重複元素的Collection。它維持它自己的內部排序,所以隨機訪問沒有任何意義。與List一樣,它同樣運行null的存在但是僅有一個。由於Set介面的特殊性,所有傳入Set集合中的元素都必須不同,同時要注意任何可變對象,如果在對集合中元素進行操作時,導致e1.equals(e2)==true,則必定會產生某些問題。實現了Set介面的集合有:EnumSet、HashSet、TreeSet。

3.1、EnumSet

      是枚舉的專用Set。所有的元素都是枚舉類型。

3.2、HashSet

      HashSet堪稱查詢速度最快的集合,因為其內部是以HashCode來實現的。它內部元素的順序是由雜湊碼來決定的,所以它不保證set 的迭代順序;特別是它不保證該順序恒久不變。

3.3、TreeSet

      基於TreeMap,產生一個總是處於排序狀態的set,內部以TreeMap來實現。它是使用元素的自然順序對元素進行排序,或者根據建立Set 時提供的 Comparator 進行排序,具體取決於使用的構造方法。

四、Map介面

      Map與List、Set介面不同,它是由一系列索引值對組成的集合,提供了key到Value的映射。同時它也沒有繼承Collection。在Map中它保證了key與value之間的一一對應關係。也就是說一個key對應一個value,所以它不能存在相同的key值,當然value值可以相同。實現map的有:HashMap、TreeMap、HashTable、Properties、EnumMap。

4.1、HashMap

      以雜湊表資料結構實現,尋找對象時通過雜湊Function Compute其位置,它是為快速查詢而設計的,其內部定義了一個hash表數組(Entry[] table),元素會通過雜湊轉換函式將元素的雜湊地址轉換成數組中存放的索引,如果有衝突,則使用散列鏈表的形式將所有相同雜湊地址的元素串起來,可能通過查看HashMap.Entry的源碼它是一個單鏈表結構。

4.2、TreeMap

      鍵以某種定序排序,內部以red-black(紅-黑)樹資料結構實現,實現了SortedMap介面

4.3、HashTable

      也是以雜湊表資料結構實現的,解決衝突時與HashMap也一樣也是採用了散列鏈表的形式,不過效能比HashMap要低

五、Queue

      隊列,它主要分為兩大類,一類是阻塞式隊列,隊列滿了以後再插入元素則會拋出異常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。另一種隊列則是雙端隊列,支援在頭、尾兩端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。

六、異同點

      出處:http://blog.csdn.net/softwave/article/details/4166598

6.1、Vector和ArrayList

      1,vector是線程同步的,所以它也是安全執行緒的,而arraylist是線程非同步,是不安全的。如果不考慮到線程的安全因素,一般用arraylist效率比較高。 
      2,如果集合中的元素的數目大於目前集合數組的長度時,vector增長率為目前數組長度的100%,而arraylist增長率為目前數組長度的50%.如過在集合中使用資料量比較大的資料,用vector有一定的優勢。 
      3,如果尋找一個指定位置的資料,vector和arraylist使用的時間是相同的,都是0(1),這個時候使用vector和arraylist都可以。而如果移動一個指定位置的資料花費的時間為0(n-i)n為總長度,這個時候就應該考慮到使用linklist,因為它移動一個指定位置的資料所花費的時間為0(1),而查詢一個指定位置的資料時花費的時間為0(i)。

      ArrayList 和Vector是採用數組方式儲存資料,此數組元素數大於實際儲存的資料以便增加和插入元素,都允許直接序號索引元素,但是插入資料要設計到數組元素移動等記憶體操作,所以索引資料快插入資料慢,Vector由於使用了synchronized方法(安全執行緒)所以效能上比ArrayList要差,LinkedList使用雙向鏈表實現儲存,按序號索引資料需要進行向前或向後遍曆,但是插入資料時只需要記錄本項的前後項即可,所以插入數度較快!

6.2、A arraylist和Linkedlist

      1.ArrayList是實現了基於動態數組的資料結構,LinkedList基於鏈表的資料結構。 
      2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指標。 
      3.對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料。 
      這一點要看實際情況的。若只對單條資料插入或刪除,ArrayList的速度反而優於LinkedList。但若是批量隨機的插入刪除資料,LinkedList的速度大大優於ArrayList. 因為ArrayList每插入一條資料,要移動插入點及之後的所有資料。

6.3、HashMap與TreeMap

      1、HashMap通過hashcode對其內容進行快速尋找,而TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。HashMap中元素的排列順序是不固定的)。

      2、  HashMap通過hashcode對其內容進行快速尋找,而TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。集合架構”提供兩種常規的Map實現:HashMap和TreeMap (TreeMap實現SortedMap介面)。

      3、在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。但如果您要按自然順序或自訂順序遍曆鍵,那麼TreeMap會更好。使用HashMap要求添加的鍵類明確定義了hashCode()和 equals()的實現。 這個TreeMap沒有調優選項,因為該樹總處於平衡狀態。

6.4、hashtable與hashmap

      1、曆史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map介面的一個實現 。

      2、同步性:Hashtable是安全執行緒的,也就是說是同步的,而HashMap是線程式不安全的,不是同步的 。

      3、值:只有HashMap可以讓你將空值作為一個表的條目的key或value 。

七、對集合的選擇7.1、對List的選擇

      1、對於隨機查詢與迭代遍曆操作,數組比所有的容器都要快。所以在隨機訪問中一般使用ArrayList

      2、LinkedList使用雙向鏈表對元素的增加和刪除提供了非常好的支援,而ArrayList執行增加和刪除元素需要進行元素位移。

      3、對於Vector而已,我們一般都是避免使用。

      4、將ArrayList當做首選,畢竟對於集合元素而已我們都是進行遍曆,只有當程式的效能因為List的頻繁插入和刪除而降低時,再考慮LinkedList。

7.2、對Set的選擇

      1、HashSet由於使用HashCode實現,所以在某種程度上來說它的效能永遠比TreeSet要好,尤其是進行增加和尋找操作。

      3、雖然TreeSet沒有HashSet效能好,但是由於它可以維持元素的排序,所以它還是存在用武之地的。

7.3、對Map的選擇

     1、HashMap與HashSet同樣,支援快速查詢。雖然HashTable速度的速度也不慢,但是在HashMap面前還是稍微慢了些,所以HashMap在查詢方面可以取代HashTable。

     2、由於TreeMap需要維持內部元素的順序,所以它通常要比HashMap和HashTable慢。

 

      個人網站:CMSBLOGS

java提高篇(二十)-----集合大家族

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.