前言
Java中常用的集合很多,在使用的時候我相信很多人都無從下手,不知道使用哪個集合更適合。爲了能讓我自己和更多人清晰的瞭解它們,並且能在一定情況下使用最適合的集合,有了本篇文章。如有錯誤或遺漏,還請大神指出,感激不盡!
數組與集合的區別
長度是否可變 | 存儲數據類型 | |
---|---|---|
數組 | 否,長度固定 | 只可以存放同類型元素,可以是基本數據類型,也可以是引用類型 |
集合 | 是,長度可變 | 可存放不同類型元素,只可以是引用類型 |
數組是我們熟知的,但使用數組有很多不便利,一旦數組被創建,程序運行期間數組長度是不可改變的。當我們需要對數組的長度做出改變或者要求數組中存放不同類型的引用數據,就可以使用集合。
Java集合總覽
集合可以看作是一種容器,用來存儲對象信息。所有集合類都在 java.util 包下,但支持多線程的集合類位於 java.util.concurrent 包下。Java的集合類主要由兩個根接口派生出來,分別是Collection 和 Map,此篇文章會分別介紹其各個子類的特點及使用方法。
Collection接口
存儲元素是否有序 | 存儲元素是否可重複 | |
---|---|---|
List(列表) | 有序 | 可重複 |
Queue(隊列) | 有序 | 可重複 |
Set(集) | 無序 | 不可重複 |
1、List集合
1)ArrayList
特點:
- List集合中最主要的常用類
- 底層數據結構是數組,
- 查詢快,增刪慢。
- 線程不安全,效率高。
2)Vector
特點:
- 底層數據結構是數組,
- 查詢快,增刪慢。
- 線程安全,效率低。
3)Stack
特點:
- 是Vector的實現類,實現一個後進先出的堆棧。
- Stack提供5個額外的方法使 Vector得以被當做堆棧使用。push 和 pop 方法,還有 peek 方法得到堆棧的元素, empty方法測試堆棧是否爲空,search 方法檢測一個元素在堆棧中的位置。Stack 剛創建後是空棧。
4)LinkedList
特點:
- 底層數據結構是鏈表
- 查詢慢,增刪快。
- 線程不安全,效率高。
2、Queue集合
- 隊列是一種特殊的線性表,它只允許在表的前端進行刪除操作,而在表的後端進行插入操作。
- Deque類是Queue的實現類。而LinkedList 類既實現了 List 接口又實現了 Deque 接口(也就實現了 Queue接口)。Queue 接口窄化了對 LinkedList 的方法的訪問權限,即在方法中的參數類型如果是 Queue 時,就完全只能訪問 Queue 接口定義的方法了,而不能直接訪問 LinkedList 的非 Queue 的方法。以使得只有恰當的方法纔可以使用。
3、Set集合
1)HashSet類
特點:
- HashSet 類是 Set 集合最常用實現類
- 底層數據結構是哈希表。
- 存取和查找性能好。
- 集合元素值可以是 null
2)LinkedHashSet
特點:
- 是 HashSet 的一個子類,具有 HashSet 的特性。
- 底層數據結構是鏈表和哈希表,由鏈表維護元素有序,元素的順序與添加順序一致。由哈希表保證元素唯一。
3)TreeSet
特點:
- 底層數據結構是二叉樹,是 SortedSet 接口的實現類,可以保證元素處於排序狀態。
- TreeSet 支持兩種元素排序:自然排序、定製排序。
Map接口
Map接口採用鍵值對 Map<k,v> 的存儲方式,保存具有映射關係的數據。因此,Map 集合裏保存兩組值,一組值用於保存 Map 裏的 key,另外一組值用於保存 Map 裏的 value,key 和 value 可以是任意類型的數據,key 值不允許重複,可以爲null。如果添加 key-value 對時 Map中已經有重複的 key,則新添加的value 會覆蓋原來對應的 value。
1、HashTable與HashSet
HashTable 與 HashSet 是 Map 接口的兩個典型實現,他們之間的關係完全類似於 ArrayList 和 Vertor.HashTable 是一個古老的Map實現類,它提供的方法比較繁瑣,目前基本不用。
特點:
- HashTable線程不安全,HashTable 線程安全。
- HashMap 通常比 HashTable 要快。因爲HashTable比較古老。
- HashMap的key與value可以是null值。HashTable不允許使用Null值作爲key和value,如果把null放入HashTable中,會發生空指針異常。
2、LinkedHashMap類
LinkedHashMap使用雙向鏈表維護 key-value對的次序(其實只需要考慮key的次序即可),該鏈表負責維護Map的迭代順序,與插入順序一致,因此性能比HashMap低,但在迭代訪問Map裏的全部元素時有較好的性能。
3、Properties類
Properties類時Hashtable類的子類,它相當於一個key、value都是String類型的Map,主要用於讀取配置文件。
4、TreeMap類
TreeMap是SortedMap的實現類,是一個二叉樹的數據結構,每個key-value對作爲二叉樹的一個節點。TreeMap存儲key-value對時,需要根據key對節點進行排序。TreeMap也有兩種排序方式:
-
自然排序:TreeMap的所有key必須實現Comparable接口,而且所有的key應該是同一個類的對象,否則會拋出ClassCastException。
-
定製排序:創建TreeMap時,傳入一個Comparator對象,該對象負責對TreeMap中的所有key進行排序。