集合框架是一個用來表明和操縱集合的統一架構。全部的集合框架都包含以下內容:java
除了集合,該框架也定義了幾個Map接口和類。Map裏存儲的是鍵/值對。儘管Map不是collections,可是它們徹底整合在集合中。算法
Java 集合框架提供了一套性能優良,使用方便的接口和類,java集合框架位於java.util包中, 因此當使用集合框架的時候須要進行導包數組
集合框架定義了一些接口。本節提供了每一個接口的概述:安全
序號 | 接口描述 |
---|---|
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 這是一個傳統的接口和定義的方法,經過它能夠枚舉(一次得到一個)對象集合中的元素。這個傳統接口已被迭代器取代。 |
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中數組大小會隨須要增長。 |
1. Set 接口實例存儲的是無序的(有無順序的實現類,也有有順序的實現類),不重複的數據。List 接口實例存儲的是有序的,能夠重複的元素。
2. Set檢索效率低下,刪除和插入效率高,插入和刪除不會引發元素位置改變 <實現類有HashSet,TreeSet>。
3. List和數組相似,能夠動態增加,根據實際存儲的數據的長度自動增加List的長度。查找元素效率高,插入刪除效率低,由於會引發其餘元素位置改變 <實現類有ArrayList,LinkedList,Vector> 。
1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
2.對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。
3.對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據。
Arraylist和Vector是採用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增長插入元素,都容許直接序號索引元素,可是插入數據要涉及到數組元素移動等內存操做,因此插入數據慢,查找有下標,因此查詢數據快,Vector因爲使用了synchronized方法-線程安全,因此性能上比ArrayList要差,LinkedList使用雙向鏈表實現存儲,按序號索引數據須要進行向前或向後遍歷,可是插入數據時只須要記錄本項先後項便可,插入數據較快。