list map set的簡單方法的總結

Java Collections Framework是Java提供的對集合進行定義,操做,和管理的包含一組接口,類的體系結構。java

 

Java集合框架的基本接口/類層次結構:算法


java.util.Collection [I]
+--java.util.List [I]
   +--java.util.ArrayList [C]
   +--java.util.LinkedList [C]
   +--java.util.Vector [C]
      +--java.util.Stack [C]
+--java.util.Set [I]
   +--java.util.HashSet [C]
   +--java.util.SortedSet [I]
      +--java.util.TreeSet [C]數組


java.util.Map [I]
+--java.util.SortedMap [I]
   +--java.util.TreeMap [C]
+--java.util.Hashtable [C]
+--java.util.HashMap [C]
+--java.util.LinkedHashMap [C]
+--java.util.WeakHashMap [C]安全

 

[I]:接口數據結構

[C]:類框架


從上圖能夠看出:性能

List和Set 都是繼承於Collection藉口,而Map 沒有繼承Collection接口。也就是說Map和Collection是2種不一樣的集合。spa

Collection能夠看做是(value)的集合,而Map能夠看做是(key,value)的集合。.net

  Map接口由Map的內容提供3種類型的集合視圖,一組key集合,一組value集合,或者一組key-value映射關係的集合。線程


因此,java集合的主要分爲三種類型:

  • Set(集)

  • List(列表)

  • Map(映射)

要深刻理解集合首先要了解下咱們熟悉的數組:

數組是大小固定的,而且同一個數組只能存放類型同樣的數據(基本類型/引用類型),而JAVA集合能夠存儲和操做數目不固定的一組數據。 全部的JAVA集合都位於 java.util包中! JAVA集合只能存放引用類型的的數據,不能存放基本數據類型

簡單說下集合和數組的區別:(參考文章:《Thinking In Algorithm》03.數據結構之數組)

  1. 有人想有能夠自動擴展的數組,因此有了List  

  2. 有的人想有沒有重複的數組,因此有了set  

  3. 有人想有自動排序的組數,因此有了TreeSet,TreeList,Tree**  

  4. 而幾乎有有的集合都是基於數組來實現的.  

  5. 由於集合是對數組作的封裝,因此,數組永遠比任何一個集合要快  

  6. 但任何一個集合,比數組提供的功能要多  

  7. 一:數組聲明瞭它容納的元素的類型,而集合不聲明。這是因爲集合以object形式來存儲它們的元素。  

  8. 二:一個數組實例具備固定的大小,不能伸縮。集合則可根據須要動態改變大小。  

  9. 三:數組是一種可讀/可寫數據結構---沒有辦法建立一個只讀數組。然而可使用集合提供的ReadOnly方法,

  10. 以只讀方式來使用集合。該方法將返回一個集合的只讀版本。



List : 是有序的,容許重複的集合,因此,有add(object )方法和add(int index,Object o)的方法。一個對象能夠反覆存儲到list集合中,每調用一次add方法,對象就被插入一次,(集合中用一個索引變量指向該對象)。可使用Iterator遍歷list中的全部對象,也可使用get(index i)來獲取。

ArrayList ,Vector, LinkedList的區別:

ArrayList 和Vector是採用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增長和插入元素,都容許直接序號索引元素,可是插入數據要設計到數組元素移動等內存操做,因此索引數據快插入數據慢,Vector因爲使用了synchronized方法(線程安全)因此性能上比ArrayList要差,LinkedList使用雙向鏈表實現存儲,按序號索引數據須要進行向前或向後遍歷,可是插入數據時只須要記錄本項的先後項便可,因此插入數度較快

ArrayList 和 Vector的區別:

1.同步性:Vector是線程安全的,而ArrayList和LinkedList是線程不安全的

2.數據增加:Vector增加原來的1倍,而ArrayList增長原來的0.5倍

ArrayList和LinkedList在性能上各有優缺點,都有各自所適用的地方,總的說來能夠描述以下: 

1.對ArrayList和LinkedList而言,在列表末尾增長一個元素所花的開銷都是固定的。對ArrayList而言,主要是在內部數組中增長一項,指向所添加的元素,偶爾可能會致使對數組從新進行分配;而對LinkedList而言,這個開銷是統一的,分配一個內部Entry對象。

2.在ArrayList的中間插入或刪除一個元素意味着這個列表中剩餘的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。

3.LinkedList不支持高效的隨機元素訪問

4.ArrayList的空間浪費主要體如今在list列表的結尾預留必定的容量空間,而LinkedList的空間花費則體如今它的每個元素都須要消耗至關的空間



Set:多個對象之間沒有明顯的順序不容許重複元素。因此add方法有一個Boolean的返回值,若是集合中含有與某個元素equals相等的元素時返回false,不然放回true。同時沒有辦法獲取第幾個元素,只能使用Iterator接口獲取全部的元素,再逐一遍歷各個元素。

HashSet按Hash算法來存儲集合的元素,所以具備很好的存取和查找性能

HashSet的特色:

(1)HashSet不是同步的,多個線程訪問是須要經過代碼保證同步

(2)集合元素值可使null。

HashSet集合判斷兩個元素相等的標準是兩個對象經過equals方法比較相等,而且兩個對象的hashCode()方法返回值也相等

hash算法的功能:

它能保證經過一個對象快速查找到另外一個對象。hash算法的價值在於速度,它能夠保證查詢獲得快速執行。

當須要查詢集合中某個元素時,hash算法能夠直接根據該元素的值獲得該元素保存位置,從而可讓程序快速找到該元素。

TressSet : 能夠對Set集合中的元素進行排序。
底層數據結構是二叉樹,保證元素惟一性。
TreeSet排序的第一中方式:讓元素自身具有比較性
元素須要實現Complare
   


Map 是雙列的集合,添加的時候使用put(obj key,obj value)方法,不能存儲重複的key,重複使用equals來判斷,使用get(obj key) 來獲得value,能夠獲取全部的key的結合,還能夠獲取全部的value的集合。

刪除clear()和remove(Object key),判斷containsValue(Object value)和containsKey(Object key)


|--Hashtable:底層是哈希表數據結構,不能夠存入null鍵null值,該集合是線程同步的。jdk1.0效率低

|--HashMap:底層是哈希表數據結構,容許使用null值和null鍵,該集合是不一樣步的。jdk1.2效率高

|--TreeMap:底層是二叉樹數據結構。線程不一樣步,能夠用於給map集合中的鍵進行排序。

和Set很像。Set底層就是使用了Map集合。

相關文章
相關標籤/搜索