1. 程式人生 > >集合框架總結-序

集合框架總結-序

集合框架初步學習後,打算寫下此係列文章總結

本文只做總的概述,不對某個集合進行詳細解析

詳細解析請移步同系列其他文章

ArrayList部分原始碼解析    

HashMap部分原始碼及疑難問題解析

Java Map遍歷方式的選——TreeMap、HashMap的key、value遍歷與效率分析


目錄

 

集合框架體系

如何選擇集合的使用


  • 集合框架體系

(圖源傳智播客 侵刪)

Collection(單列集合)
        |--List    有序,可重複
            |--ArrayList
                底層資料結構是陣列,查詢快,增刪慢。
                執行緒不安全,效率高
            |--Vector
                底層資料結構是陣列,查詢快,增刪慢。
                執行緒安全,效率低
            |--LinkedList
                底層資料結構是連結串列,查詢慢,增刪快。
                執行緒不安全,效率高
        |--Set    無序,唯一 (只能用迭代器 沒有了get方法)
            |--HashSet
                底層資料結構是雜湊表
                如何保證元素唯一性
                    依賴兩個方法:hashCode()和equals()
                    開發中自動生成這兩個方法即可
                |--LinkedHashSet
                    底層資料結構是連結串列和雜湊表
                    由連結串列保證元素有序       (儲存與取出順序一致)
                    由雜湊表保證元素唯一
            |--TreeSet
                底層資料結構是紅黑樹
                如何保證元素排序
                    自然排序        泛型重寫實現Comparable介面 重寫compare(T o1, T o2)方法
                    比較器排序    建構函式實現Comparator介面 重寫CompareTo(T o)方法
                如何保證元素唯一性
                    根據比較的返回值是否是0來決定

Map(雙列集合)     

            |--HashMap

                底層資料結構是雜湊表(陣列+連結串列)和紅黑樹    PS:JDK8之前只是雜湊表 沒有紅黑樹 JDK8中紅黑樹也只是作為補充

                由雜湊表保證鍵唯一  注意只是鍵唯一 值並不唯一

                元素以鍵值對方式儲存,通過鍵可以對映到值  習慣上將HashMap<K,V>的物件稱為雜湊對映

                    |--LinkedHashMap

                       底層資料結構是雜湊表+連結串列

                       由雜湊表保證鍵唯一  連結串列保證元素有序    (儲存與取出順序一致)

                       元素以鍵值對方式儲存,通過鍵可以對映到值

            |--TreeMap

                底層資料結構是雜湊表(陣列+連結串列)和紅黑樹  

                由雜湊表保證鍵唯一   紅黑樹實現排序           


  • 如何選擇集合的使用

           集合框架體系龐大,要想合理的使用集合必須先了解集合的特點,而各自的特點其實通過集合的名字就已經可以瞭解大概

  •     ArrayXxx:底層資料結構是陣列,查詢快,增刪慢
  •     LinkedXxx:底層資料結構是連結串列,查詢慢,增刪快
  •     HashXxx:底層資料結構是雜湊表。依賴兩個方法:hashCode()和equals()
  •     TreeXxx:底層資料結構是二叉樹。兩種方式排序:自然排序和比較器排序

           通過命名規律,我們便可以在特定的場景選擇合適的集合了

           當難以判斷用Collection體系還是Map體系時  用Collection體系          

Collection

唯一嗎?

        是:Set

            排序嗎?

                是:TreeSet

                否:HashSet 

                要儲存與取出順序一致: LinkedHashSet

如果你知道是Set,但是不知道是哪個Set,就用HashSet 

            

        否:List

            要執行緒安全嗎?

                是:Vector

                否:ArrayList或者LinkedList

                    查詢多:ArrayList

                    增刪多:LinkedList

如果你知道是List,但是不知道是哪個List,就用ArrayList

 

如果需要以鍵值對方式儲存物件 則使用Map體系

Map

           要執行緒安全嗎?

                是:Hashtable(注意! Hashtable不屬於Map體系 只是用法相似  其繼承自java.util.Dictionary<K,V>)

                否:   HashMap/TreeMap

                               要排序嗎?

                                         是:TreeMap

                                         否:   HashMap

                                                      要儲存與取出順序順序一致:  LinkedHashMap

如果你知道是Map,但不知道用哪個Map,就用HashMap

 

一般情況下,用ArrayList足以應對大多數情況了,因為我們可以使用Collections工具來對集合進行進一步操作

  •    public static <T> void sort(List<T> list):排序 預設情況下是自然順序。
  •    public static <T> void sort(List<T> list,Comparator<? super T> c):   使用比較器指定的排序方式進行排序
  •    public static <T> int binarySearch(List<?> list,T key):二分查詢
  •    public static <T> T max(Collection<?> coll):最大值 
  •    public static void reverse(List<?> list):反轉
  •    public static void shuffle(List<?> list):隨機置換
  •    public static <T> List<T> synchronizedList(List<T> list):返回由指定列表支援的同步(執行緒安全)列表

值的一提的是 使用 synchronizedList方法返回的執行緒安全集合,並對其迭代時要加上同步鎖 否則可能會有不可預料的結果

以下源自API

          在迭代時,使用者必須在返回的列表上手動同步: 
          
            List list = Collections.synchronizedList(new ArrayList());
                ...
             synchronized (list) {
                Iterator i = list.iterator(); // Must be in synchronized block
                while (i.hasNext())
                    foo(i.next());
             }