這一次來介紹一下常用的集合:
首先是兩種集合的《家庭系譜圖》:
接下來介紹一下集合的種類:
Collection
Set
-
SetTreeSet:基于紅?樹實現,?持有序性操作,例如:根據?個范圍查找元素的操作。但是查找效率不如HashSet,HashSet 查找的時間復雜度為 O(1),TreeSet 則為 O(logN)。
-
HashSet:基于哈希表實現,?持快速查找,但不?持有序性操作。并且失去了元素的插?順序信息,也就是說使? Iterator 遍歷 HashSet 得到的結果是不確定的。
-
LinkedHashSet:具有 HashSet 的查找效率,且內部使?雙向鏈表維護元素的插?順序。
List
-
ArrayList:基于動態數組實現,?持隨機訪問。
-
Vector:和 ArrayList 類似,但它是線程安全的。
-
LinkedList:基于雙向鏈表實現,只能順序訪問,但是可以快速地在鏈表中間插?和刪除元素。不僅如此,LinkedList 還可以?作棧、隊列和雙向隊列。
Queue
-
LinkedList:可以?它來實現雙向隊列。
-
PriorityQueue:基于堆結構實現,可以?它來實現優先隊列。
Map
-
TreeMap:基于紅?樹實現。
-
HashMap:基于哈希表實現。
-
HashTable:和 HashMap 類似,但它是線程安全的,這意味著同?時刻多個線程可以同時寫入并且不會導致數據不?致。它是遺留類,不應該去使?它。現在可以使? ConcurrentHashMap 來?持線程安全,并且 ConcurrentHashMap 的效率會更?,因為 ConcurrentHashMap 引?了分段鎖。
-
LinkedHashMap:使?雙向鏈表來維護元素的順序,順序為插?順序或者最近最少使?(LRU)順序。
三種常用的集合有什么區別呢?
-
List
有序集合:List中的元素有序,即元素按照添加的順序排列。 允許重復:List可以包含重復的元素。
實現類:常見的實現類有ArrayList、LinkedList和Vector等。 常用操作:支持通過索引來訪問元素,例如get(int index)。 用途:適用于需要元素有序或需要經常通過索引訪問元素的場景。 -
Set
無序集合:Set中的元素無序,元素的順序可能會在每次插入或刪除操作后發生變化。
不允許重復:Set不允許包含重復的元素,每個元素都是唯一的。
實現類:常見的實現類有HashSet、TreeSet和LinkedHashSet等。
常用操作:主要提供添加、刪除和檢查元素是否存在的操作。 用途:適用于需要確保元素唯一性的場景,例如去重、集合操作等。 -
Map
鍵值對集合:Map存儲鍵值對(key-value pairs),每個鍵映射到一個值。 鍵的唯一性:Map中的鍵是唯一的,但值可以重復。
實現類:常見的實現類有HashMap、TreeMap和LinkedHashMap等。
常用操作:通過鍵來訪問、添加或刪除對應的值,例如get(Object key)、put(K key, V value)。
用途:適用于需要根據鍵來快速查找、更新或刪除值的場景,例如數據庫索引、緩存等。
總結:List適用于需要元素有序或索引訪問的場景;Set適用于需要元素唯一且無序的場景;Map適用于需要通過鍵來存儲和訪問值的場景。
下來是常用的集合中ArrayList 和LinkedList的一些辨別
ArrayList 和LinkedList的區別?
ArrayList:底層是基于數組實現的,查找快,增刪較慢;
LinkedList:底層是基于鏈表實現的。確切的說是循環雙向鏈表(JDK1.6 之前是雙向循環鏈表、JDK1.7 之后取消了循環),查找慢、增刪快。LinkedList 鏈表由?系列表項連接?成,?個表項包含 3 個部分:元素內容、前驅表和后驅表。鏈表內部有?個 header 表項,既是鏈表的開始也是鏈表的結尾。header 的后繼表項是鏈表中的第?個元素,header 的前驅表項是鏈表中的最后?個元素。
ArrayList 的增刪未必就是? LinkedList 要慢:
- 如果增刪都是在末尾來操作【每次調?的都是 remove() 和 add()】,此時 ArrayList 就不需要移動和復制數組來進?操作了。如果數據量有百萬級的時,速度是會? LinkedList 要快的。
就不需要移動和復制數組來進?操作了。如果數據量有百萬級的時,速度是會? LinkedList 要快的。
- 如果刪除操作的位置是在中間。由于 LinkedList 的消耗主要是在遍歷上,ArrayList 的消耗主要是在移動和復制上(底層調?的是 arrayCopy() ?法,是 native ?法)。LinkedList 的遍歷速度是要慢于
ArrayList 的復制移動速度的如果數據量有百萬級的時,還是 ArrayList 要快。