淺析Java中的集合包(ArrayList,LinkedList,Vector, Stack,HashSet,TreeSet,HashMap,TreeMap)__Java

來源:互聯網
上載者:User

集合包是Java中最常用的包,它最常用的有Collection和Map兩個介面的實作類別,Collection用於存放多個單對象,Map用於存放Key-Value形式的索引值對。

        Collection中常用的又分為兩種類型的介面:List和Set,兩者最明顯的差別為List支援放入重複的對象,而Set不支援。List介面常用的實作類別有:ArrayList,LinkedList,Vector和Stack;Set介面常用的實現有HashSet,TreeSet。而Map的常用實現有TreeMap和HashMap。

1. ArrayList基於數組方式實現,無容量的限制。

2. ArrayList在執行插入元素時可能要擴容,在刪除數組時並不會減少數組的容量(如希望相應的減少數組的容量,可以調用ArrayList的trimToSize()),在尋找元素時需要遍曆數組,對於非null的元素採取equals的方式尋找。

3.ArrayList是非安全執行緒的。

1. LinkedList基於雙向鏈表機制實現。

2. LinkedList在插入元素時,必須建立一個新的Entry對象,並切換相應元素的前後元素的引用;在尋找元素時,須遍曆列表;在刪除元素時,要遍曆列表,找到要刪除的元素,然後從列表上將此元素刪除即可。

3. LinkedList是非安全執行緒的。

從LinkedList和ArrayList的區別來看,我們可容易的得出什麼時候使用ArrayList,什麼時候使用LinkedList:

     1)對於隨機訪問get和set,ArrayList優於LinkedList,因為LinkedList要移動指標。 
     2)  對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料。

三、Vector

      和ArrayList的不同點有

      1) Vector是基於Synchronized實現的安全執行緒的ArrayList。即Vector是安全執行緒的。

      2)在插入元素時容量擴充的機制和ArrayList稍微有所不同,Vector是擴充2倍,並 可通過傳入capacityIncrement來控制容量的擴充。 而ArrayList是擴充1.5倍並加1。

四、Stack

      Stack繼承與Vector,在Vector的基礎上實現了Stack所要求的後進先出(LIFO)的彈出即壓入操作,其提供了push,pop,peek等三個主要方法。

五、HashSet

      1. HashSet基於HashMap實現,無容量限制。

      2. HashSet是非安全執行緒的。 

      3. HashSet不保證有序。

六、TreeSet

      1、TreeSet基於TreeMap實現,支援排序。

      2、TreeSet是非安全執行緒的。

從對HashSet和TreeSet的描述來看,TreeSet和HashSet一樣,也是完全基於Map來實現的,並且都不支援get(int)來擷取指定位置的元素(需要遍曆擷取),另外TreeSet還提供了一些排序方面的支援。例如傳入Comparator實現、descendingSet以及descendingIterator等。 

七、HashMap

       1、HashMap採用數組方式儲存key,value構成的Entry對象,無容量限制。

       2、HashMap基於Key hash尋找Entry對象存放到數組的位置,對於hash衝突採用鏈表的方式來解決。

       3、HashMap在插入元素時可能會要擴大數組的容量,在擴大容量時須要重新計算hash,並複製對象到新的數組中。

       4、HashMap是非安全執行緒的。

       5、HashMap遍曆使用的是Iterator

八、HashTable

      1、HashTable是安全執行緒的。

      2、HashTable中無論是Key,還是Value都不允許為null。

      3.   HashTable遍曆使用的是Enumeration。

曾經HashTable的應用非常廣泛,HashMap是新架構中用來代替HashTable的類,也就是說建議使用HashMap,不要使用HashTable,可以使用ConcurrentHashMap。那麼幾者之間有什麼區別呢。

      1、HashTable的內部儲存結構

HashTable和HashMap採用相同的儲存機制,二者的實現基本一致,不同的是:

     1)、HashMap是非安全執行緒的,HashTable是安全執行緒的,內部的方法基本都是synchronized。

     2)、HashTable不允許有null值的存在。

在HashTable中調用put方法時,如果key為null,直接拋出NullPointerException。其它細微的差別還有,比如初始化Entry數組的大小等等,但基本思想和HashMap一樣。

       2、HashTable和 ConcurrentHashMap的比較

ConcurrentHashMap是目前最好的安全執行緒的HashMap的實現。同樣是安全執行緒的類,它與HashTable在同步方面有什麼不同呢。

HashTable使用synchronized關鍵字來確保同步,而Synchronized其實是對對象加鎖,不論你是在方法前加synchronized還是語句塊前加, 鎖住的都是對象整體 , 但是ConcurrentHashMap的同步機制和這個不同,它不是加synchronized關鍵字,而是基於lock操作的,這樣的目的是保證同步的時候,鎖住的不是整個對象。事實上,ConcurrentHashMap可以滿足concurrentLevel個線程並發無阻塞的操作集合對象。

需要特別注意的是,我們在具體的項目開發中必須對HashMap的非安全執行緒保持足夠的關注,如果在並發情境中不保持足夠的同步,就有可能在執行HashMap.get是進入死迴圈,將CPU耗到100%。

       1、TreeMap是一個典型的基於紅/黑樹狀結構的Map實現,因此它要求一定要有Key比較的方法,要麼傳入Comparator實現,要麼key對象實現Comparable介面。

       2、TreeMap是非安全執行緒的。

聯繫我們

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