java集合講解

java集合講解

1.概述
  • 集合類的頂級接口是Iterable ,Collection 繼承了Iterable接口
  • 經常使用的集合主要有 3 類,Set,List,Queue,他們都是接口,都繼於Collection
  • Set下的實現類有HashSet,LinkedHashSet,TreeSet等
  • List下的實現類主要有ArrayList,Vector,LinkedList
  • Queue基本上是一個先入先出(FIFO)數據結構的隊列

集合類名 數據結構 特色
ArrayList 數組 查詢快,增刪慢,線程不安全,但效率較Vector高
Vector 數組 查詢快,增刪慢,線程安全,但效率相對較低
LinkedList 雙向鏈表 查詢慢,增刪快,線程不安全,效率高
HashSet 哈希表 集合內數據不重複,依賴hashCode()和equals()方法,但元素亂序
LinkedHashSet 鏈表與哈希表 數據不重複,保證遍歷順序爲插入順序(區分:不是排序)
TreeSet 紅黑樹 數據不重複且有序,支持天然排序和自定義排序(Comparable接口)
2.List
  • ArrayList和Vector內部都採用數組實現,不指定大小的狀況下,默認容量10,數組的特色,查詢(根據索引訪問)直接尋址,因此查詢的效率很是高
  • ArrayList與Vector的實現基本同樣,但Vector方法上都使用synchronized加鎖來保證線程安全,相比ArrayList來講效率較低,因此通常咱們使用ArrayList,併發也可外部本身來實現
  • ArrayList和Vector尾部添加元素時,也就是經常使用的add() 方法,若是當前容量足夠,不涉及擴容,添加效率也很高
  • 咱們通常說ArrayList和Vector增刪慢,是由於中間插入、刪除,即add(index, element)和remove(index),或者須要擴容的尾部添加,在這樣的操做時,ArrayList和Vector都須要進行數組的重組,頻繁觸發影響效率
  • LinkedList內部採用了雙向鏈表,在插入與刪除時,僅僅調整鏈表指針指向,因此增刪效率高,但對於元素獲取,雖然LinkedList可根據索引大小來判斷前序遍歷仍是後序遍歷,但效率都較ArrayList和Vector低
3.Set
  • HashSet底層其實是一個HashMap ,初試化容量都是16,默認加載因子是0.75.
  • HashSet內部元素不重複, 是根據hashCode()和equals()方法來控制,先根據hashCode()獲取hash值,hash值重複則調用equals()方法,因此若是要自定義重複規則,須要重寫hashCode()和equals()方法
  • HashSet遍歷元素是無序的,既不記錄插入順序,內部元素也不按規則排序
  • LinkedHashSet是HashSet的子類,內部是LinkedHashMap,即鏈表加哈希表,初試化容量都是16,默認加載因子是0.75,經過鏈表來保證了記錄插入順序
  • TreeSet底層是紅黑樹,排序經過Comparable接口的compareTo()方法來實現,自定義對象若是須要排序須要重寫該方法
  • 須要特別注意的是:咱們常說LinkedHashSet有序, 這個是指他的遍歷順序與插入順序是一致的,而說的TreeSet有序,是指其內部元素是按必定規則排序的,這個千萬要區分
4.Queue
  • Queue隊列默認使用FIFO(先進先出)規則
  • 實現類PriorityQueue 和 ConcurrentLinkedQueue是不阻塞隊列,PriorityQueue 類實質上維護了一個有序列表,ConcurrentLinkedQueue 是基於連接節點的、線程安全的隊列
  • 而阻塞隊列類,它實質上就是一種帶有一點扭曲的 FIFO 數據結構。不是當即從隊列中添加或者刪除元素,線程執行操做阻塞,直到有空間或者元素可用
    • ArrayBlockingQueue :一個由數組支持的有界隊列
    • LinkedBlockingQueue :一個由連接節點支持的可選有界隊列
    • PriorityBlockingQueue :一個由優先級堆支持的無界優先級隊列
    • DelayQueue :一個由優先級堆支持的、基於時間的調度隊列
    • SynchronousQueue :一個利用 BlockingQueue 接口的簡單彙集(rendezvous)機制
相關文章
相關標籤/搜索