數組和集合的區別:
? ? ? ? 1、數組是固定長度的數據結構,一旦創建長度就無法改變,集合是動態長度數據結構,可根據需求動態增加或減少元素。
? ? ? ? 2、數組包含基本數據類型和對象,而集合只能包含對象。
? ? ? ? 3、數組可以直接訪問元素,而集合需要通過迭代器或其他方法訪問元素。
常用集合類:
? ? ? ? 1、ArrayList:動態數組,實現了List接口,支持動態增長(超限擴容到size+size>>2)。
? ? ? ? 2、LinkedList:雙向鏈表,實現了List接口,支持快速插入和刪除操作。
? ? ? ? 3、HashMap:基于哈希表實現,存儲鍵值對,數組加鏈表形式,哈希沖突時使用拉鏈法將沖突的鍵值對存儲到額外維護的鏈表中。
? ? ? ? 4、HashSet:基于HashMap實現的Set集合,用于存儲唯一元素。
? ? ? ? 5、TreeMap:基于紅黑樹實現的有序Map集合,可以按照鍵的順序進行排序。
? ? ? ? 6、LinkedHashMap:基于哈希表和雙向鏈表實現的Map集合,保持插入順序或訪問順序。
? ? ? ? 7、PriorityQueue:優先隊列,可以按照比較器或元素的自然順序進行排序。??
List接口
? ? ? ? List是有序的Collection,使用此接口能夠精確控制每個元素的插入和刪除位置,允許根據索引訪問元素。常用的實現類有LinkedList,ArrayList,Vector,Stack。
? ? ? ? ArrayList:容量可變的非線程安全列表。底層使用數組。實現。每次插入新元素時會檢查容量是否充足。擴容時默認創建1.5倍的新數組并進行原數組的復制。ArrayList保留了數組的快速查詢特性,但同時也保留了插入和刪除速度慢的缺點。
? ? ? ? Vector:線程安全的動態數組,內部方法經過synchronzed修飾。擴容時會創建新數組并復制。
? ? ? ? LinkedList:本質是一個雙向鏈表,有更快的插入和刪除速度,但查詢較慢。
Map接口
? ? ? ? Map是一個鍵值對集合,存儲鍵、值之間的映射,Key無序且唯一,Value不要求有序且允許重復。Map并未繼承Collection接口,從Map集合檢索元素時,只要給出Key就會返回對應的值對象。主要實現有TreeMap,HashMap,LinkedHashMap,CurrentHashMap.
? ? ? ? HashMap:由數組和鏈表組成,數組是HashMap的存儲主體,鏈表用于解決Hash沖突。每個數組元素指向一個對應的鏈表。
????????“拉鏈法”:將哈希沖突的鍵值對存儲在數組元素對應的鏈表中。Java8后鏈表長度大于閾值(默認為8)后會轉化為紅黑樹,以減少搜索時間。
? ? ? ? LinkedHashMap:繼承自HashMap。在其基礎上增加了一條雙向鏈表,以維護插入元素的順序。
? ? ? ? TreeMap:紅黑樹(自平衡的排序二叉樹)
? ? ? ? HashTable:線程安全的HashMap(方法使用synchronzed同步鎖修飾,鎖整表)
? ? ? ? ConcurrentHashMap:線程安全的HashMap(使用volatile+CAS或synchronzed同步鎖,對每個元素加鎖)。put操作時,若Key不存在,則使用CAS操作賦值為當前值,若Key已經存在,則使用synchronzed關鍵字申請鎖,再進行鏈表的新增操作。
Set接口
? ? ? ? Set不允許存在重復元素,set集合的元素一般是無序的,且不支持通過索引訪問。常用的實現有HashSet、LinkedHashSet和TreeSet
? ? ? ? HashSet:基于HashMap實現,HashMap的Key即為HashSet存儲的元素,所有Key都使用相同的Value,一個名為PRESENT的Object常量,使用Key保證元素唯一性,但不保證有序性,也不是線程安全(HashMap不是線程安全)。
? ? ? ? LinkedHashSet:繼承自HashSet,基于LinkedHashMap實現,使用雙向鏈表維護元素插入順序。
? ? ? ? TreeSet:基于TreeMap實現,添加元素到集合時按照比較規則將其插入合適的位置,保證插入后的集合仍然有序。
????????