Java集合框架

1、集合框架

集合框架是一個用來表明和操縱集合的統一架構。全部的集合框架都包含以下內容:java

  • 接口:是表明集合的抽象數據類型。接口容許集合獨立操縱其表明的細節。在面向對象的語言,接口一般造成一個層次。
  • 實現(類):是集合接口的具體實現。從本質上講,它們是可重複使用的數據結構。
  • 算法:是實現集合接口的對象裏的方法執行的一些有用的計算,例如:搜索和排序。這些算法被稱爲多態,那是由於相同的方法能夠在類似的接口上有着不一樣的實現。

除了集合,該框架也定義了幾個Map接口和類。Map裏存儲的是鍵/值對。儘管Map不是collections,可是它們徹底整合在集合中。算法

集合框架體系如圖所示

Java 集合框架提供了一套性能優良,使用方便的接口和類,java集合框架位於java.util包中, 因此當使用集合框架的時候須要進行導包數組

2、集合接口

集合框架定義了一些接口。本節提供了每一個接口的概述:安全

 

序號 接口描述
1 Collection 接口

Collection 是最基本的集合接口,一個 Collection 表明一組 Object,即 Collection 的元素, Java不提供直接繼承自Collection的類,只提供繼承於的子接口(如List和set)。數據結構

2 List 接口

List接口是一個有序的 Collection,使用此接口可以精確的控制每一個元素插入的位置,可以經過索引(元素在List中位置,相似於數組的下標)來訪問List中的元素,第一個元素的索引爲 0,並且容許有相同的元素。多線程

3 Set

Set 具備與 Collection 徹底同樣的接口,只是行爲上不一樣,Set 不保存重複的元素。架構

4 SortedSet
繼承於Set保存有序的集合。
5 Map
將惟一的鍵映射到值。
6 Map.Entry
描述在一個Map中的一個元素(鍵/值對)。是一個Map的內部類。
7 SortedMap
繼承於Map,使Key保持在升序排列。
8 Enumeration
這是一個傳統的接口和定義的方法,經過它能夠枚舉(一次得到一個)對象集合中的元素。這個傳統接口已被迭代器取代。

 

 

3、集合實現類

Java提供了一套實現了Collection接口的標準集合類。其中一些是具體類,這些類能夠直接拿來使用,而另一些是抽象類,提供了接口的部分實現。框架

標準集合類彙總於下表:性能

 

序號 類描述
1 AbstractCollection 
實現了大部分的集合接口。
2 AbstractList 
繼承於AbstractCollection 而且實現了大部分List接口。
3 AbstractSequentialList 
繼承於 AbstractList ,提供了對數據元素的鏈式訪問而不是隨機訪問。
4 LinkedList

該類實現了List接口,容許有null(空)元素。主要用於建立鏈表數據結構,該類沒有同步方法,若是多個線程同時訪問一個List,則必須本身實現訪問同步,解決方法就是在建立List時候構造一個同步的List。例如: spa

Listlist=Collections.synchronizedList(newLinkedList(...));

LinkedList 查找效率低。

5 ArrayList

該類也是實現了List的接口,實現了可變大小的數組,隨機訪問和遍歷元素時,提供更好的性能。該類也是非同步的,在多線程的狀況下不要使用。ArrayList 增加當前長度的50%,插入刪除效率低。

6 AbstractSet 
繼承於AbstractCollection 而且實現了大部分Set接口。
7 HashSet

該類實現了Set接口,不容許出現重複元素,不保證集合中元素的順序,容許包含值爲null的元素,但最多隻能一個。

8 LinkedHashSet
具備可預知迭代順序的 Set 接口的哈希表和連接列表實現。
9 TreeSet

該類實現了Set接口,能夠實現排序等功能。

10 AbstractMap 
實現了大部分的Map接口。
11 HashMap
HashMap 是一個散列表,它存儲的內容是鍵值對(key-value)映射。
該類實現了Map接口,根據鍵的HashCode值存儲數據,具備很快的訪問速度,最多容許一條記錄的鍵爲null,不支持線程同步。
12 TreeMap
繼承了AbstractMap,而且使用一顆樹。
13 WeakHashMap
繼承AbstractMap類,使用弱密鑰的哈希表。
14 LinkedHashMap
繼承於HashMap,使用元素的天然順序對元素進行排序.
15 IdentityHashMap
繼承AbstractMap類,比較文檔時使用引用相等。

 

在前面的教程中已經討論經過java.util包中定義的類,以下所示:

 

序號 類描述
1 Vector

該類和ArrayList很是類似,可是該類是同步的,能夠用在多線程的狀況,該類容許設置默認的增加長度,默認擴容方式爲原來的2倍。

2 Stack
棧是Vector的一個子類,它實現了一個標準的後進先出的棧。
3 Dictionary
Dictionary 類是一個抽象類,用來存儲鍵/值對,做用和Map類類似。
4 Hashtable

Hashtable 是 Dictionary(字典) 類的子類,位於 java.util 包中。

5 Properties
Properties 繼承於 Hashtable,表示一個持久的屬性集,屬性列表中每一個鍵及其對應值都是一個字符串。
6 BitSet
一個Bitset類建立一種特殊類型的數組來保存位值。BitSet中數組大小會隨須要增長。

 

4、區別

Set和List的區別

  • 1. Set 接口實例存儲的是無序的有無順序的實現類,也有有順序的實現類),不重複的數據。List 接口實例存儲的是有序的,能夠重複的元素。

  • 2. Set檢索效率低下,刪除和插入效率高,插入和刪除不會引發元素位置改變 <實現類有HashSet,TreeSet>

  • 3. List和數組相似,能夠動態增加,根據實際存儲的數據的長度自動增加List的長度。查找元素效率高,插入刪除效率低,由於會引發其餘元素位置改變 <實現類有ArrayList,LinkedList,Vector>

ArrayList和LinkedList的區別:  

1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。 
  2.對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。 
  3.對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據。

 

Arraylist、LinkedList和Vector的區別

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

相關文章
相關標籤/搜索