collections集合的總括。


      序言

          突然遇到集合的有關面試題,感覺很懵逼,所以特意總結了一下,關於我們常用的 ArrayList、LinkedList、Set等集合的一些區別和用法。

          還有,這份微小型總結肯定是從很多博文中摘取精華拿過來的,因為我還是一個菜鳥,不能自己寫出自己的見解,還是在學習的路程中,見諒。

              參考博文:

                    http://shmilyaw-hotmail-com.iteye.com/blog/1595399

                    http://www.cnblogs.com/nayitian/p/3266090.html#collectionframe    

                大神真的很多,學無止境,學的越多,越發現自己的無知,感謝能站在巨人的肩膀上前行。

          個人想法:這只是初步的一份小總結,之后的文章會對每一個集合進行詳細的講解,比如,看源碼,內部如何實現的,這樣加深自己對這些集合的理解


                                                                              ------WZY

一、簡述

        這是collection總體的一個關系圖,很龐大,我就挑我們常用的來講解一下。

              

 

    集合類這塊,總的來說,就分為兩大類,

      1:按照一定順序進行迭代訪問的集合類

      2:按照key、value這樣的鍵值對關系進行訪問的集合類

 

二、第一種,按照一定順序進行迭代訪問的集合類的繼承關系圖,

        

    Set接口:無順序,不可重復。

      HashSet類:方便用於數據的查詢,加入的元素特別要注意hashCode()方法的實現,不是同步的,多線程訪問同一個hashSet對象時,需要手工同步

      LinkedHashSet類:根據元素的hashCode值來決定元素的存儲位置,但它同時使用鏈表維護元素的次序。與HashSet相比方便用於數據的增加和刪除,

                這兩個就好比arrayList和LinkedList,一個方便查詢一個方便增刪

      SortSet類是SortedSet接口的實現類:看類名是用來排序等其他功能來使用的。后面的文章我會一一更加詳細的解釋。

      EnumSet類:專為枚舉類設計的集合類,EnumSet中的所有元素都必須是指定枚舉類型的枚舉值

 

    List接口:有順序,可以重復

      LinkedList類:內部使用鏈表的形式來存儲數據,在增加和刪除數據上面性能更好

            它實現了List接口和Deque接口,說明它具有兩邊接口的特性,因此它可以當作一個雙端隊列來用,也可以當作棧來用,並且它是以鏈表的形式來實現的,所以查詢性能差,但是增加和刪除操作性能高。

      ArrayList類:內部使用數組來存儲數據,也就相當於數據結構的順序表存儲,在查詢數據上面性能好,

      Vertor類:跟ArrayList相比,它是線程安全的,而ArrayList是線程不安全的,

      Stack類繼承Vertor類:看名字,其實就是方便模擬“棧”這種數據結構

    

    Queue接口:用於模擬隊列這種數據結構,然后該接口中聲明了一些基本操作的方法。例如:add、offer、remove等

      PriorityQueue類:PriorityQueue保存隊列元素的順序並不是按照加入隊列的順序,而是按隊列元素的大小重新排序

      Deque接口:Deque代表一個雙端隊列,可以當作一個雙端隊列使用,也可以當作“棧”來使用,因為它包含出棧pop()與入棧push()方法。

      ArrayDeque類為Deque的實現類:也就是實現了Deque接口中定義的方法,解釋跟deque差不多

 

 

  各種線性表選擇策略

  1. 數組:是以一段連續內存保存數據的;隨機訪問是最快的,但不支持插入、刪除、迭代等操作。
  2. ArrayList與ArrayDeque:以數組實現;隨機訪問速度還行,插入、刪除、迭代操作速度一般;線程不安全。
  3. Vector:以數組實現;隨機訪問速度一般,插入、刪除、迭代速度不太好;線程安全的。
  4. LinkedList:以鏈表實現;隨機訪問速度不太好,插入、刪除、迭代速度非常快。

 

 

      

三、第二種,使用key、value鍵值對的形式進行訪問的集合類。

                

      Map接口:定義一些基本的操作,例如put(key,value), containKey(Object key)等一系列操作。

         HashMap類Hashtable類對比,一般使用HashMap,因為Hashtable類是很古老的,據查都不建議用。平常我們也是用HashMap

            HashMap類是線程不安全的,而Hashtable是線程安全的

            HashMap類可以使用null作為key和value,而Hashtable不可以

         Properties類繼承Hashtable類

            增加了額外的一些方法,例如:load(InputStream inStream)從屬性文件加載key-value等方法。

            可以將key-value用xml文件的格式保存,可能就是跟xml文件打一些交道

         LinkedHashMap類繼承HashMap類

            LinkedHashMap從HashMap類繼承而來。以鏈表來維護內部順序。很多方面跟LinkedHashSet類似。LinkedHashMap它可以記住key-value對的添加時的順序, 同時避免使用            TreeMap時性能受到的影響。

         SortedMap接口TreeMap實現類

             類似於SortedSet及TreeSet,TreeMap也可以自定義比較器(Comparable)實現定制排序。它的額外提供的方法也與TreeSet類似,增加了訪問第一個、前一個、后一個、最              后一個key-value對的方法,並提供了從TreeMap中提取子集的方法。TreeMap不允許null作為key,要不然怎么比較呢?

         IdentityHashMap類   

            與HashMap的不同在於,只有兩個key嚴格相等(key1 == key2)時,IdentityHashMap才認為兩個key相等;而對於普通HashMap而言,只要key1.equals(key2)且hashCode相同即可。同樣允許null值,不能保證順序。

          

         EnumMap類

            EnumMap是一個與枚舉類一起使用的Map實現。它的key必須是單個枚舉類的枚舉值。EnumMap不允許使用null作為key,但可作為value。 

 

    各種Map實現類選擇策略

      

  1. 正常情況使用HashMap,而不是Hashtable。
  2. 如果考慮排序,那么考慮使用TreeMap。通常TreeMap比HashMap等在插入、刪除操作時要慢不少,因為它需要在底層采用紅黑樹來管理key-value對。
  3. 如果考慮插入時的順序,那么使用LinkedHashMap是個不錯的選擇。
  4. 如果想優化垃圾回收,建議使用WeakHashMap實現類(本文未提及);要求key完全匹配(同一對象),則使用IdentityHashMap;還有枚舉類不多說了。
  5. 關於null值:Hashtable不允許key為null,也不允許value為null;TreeMap與EnumMap不允許key為null;HashMap及其子類LinkedHashMap,IdentityHashMap允許key為null。

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM