1. 程式人生 > >集合容器概覽

集合容器概覽

ret 定義排序 ger 優先 意義 刪除 技能 java類 結構

  Java世界中,泛型和集合容器的存在大大的提高了程序員的編程能力,是開發者技能百寶箱中的重要武器之一,、因此掌握集合框架的實現原理及內部結構變得非常的重要。本文主要對集合框架體系中日常開發經常遇到的接口、抽象類及其實現類進行梳理,從宏觀上去理解整個集合框架體系,具體實現類的源碼實現原理分析在單獨的博客中進行詳述。

  • 集合框架簡圖

技術分享圖片   

               Collection接口及其實現類

  Collection:Collection接口代表存儲一組獨立元素序列的容器,其代表的容器主要有Set(無序無重復元素)、List(元素按添加的順序存儲,可重復)、Queue(按先進先出的順序存儲元素,多線程環境中常用作隊列)。

                      

技術分享圖片

              Map接口及其實現類            

  Map:Map接口又稱為關聯數組其代表鍵值對的存儲結構,代表的容器主要有HashMap(采用哈希存儲,無序但查找性能最快)、TreeMap(有序,可自定義排序方式,查找性能遜色於HashMap)、LinkedHashMap(性能上在HashMap和TreeMap之間折中,內部使用鏈表結構存儲,遍歷時按插入順序排序)。

  • 常用容器類及接口分析

  List

    List可將元素維護在特定的序列中,其在Colletion接口的基礎上添加了大量方法,使得可以在List

中間添加或刪除元素。List接口的實現類主要有ArrayList(底層基於數組)LinkedList(底層基於雙向鏈表),具體特性如下:

    • ArrayList(隨機訪問元素性能較高、向指定位置添加元素需要移動元素,不適用於需要頻繁添加或刪除元素的場景)
    • LinkedList(添加或刪除元素性能較高、隨機訪問元素代價較高、特性集較ArrayList更為強大)

  技術分享圖片

  圖示方法均繼承自Collection接口,屬於日常開發中常用方法,其中LinkedList同時實現了Deque接口(基於雙端隊列),相比ArrayList功能上更為強大,可用作棧(Stack)隊列(Queue).

  Set

   Set可確保添加元素的唯一性,不允許添加重復元素,其實現類主要有HashSet(底層基於HashTable)LinkedHashSet(底層基於鏈表)TreeSet(底層基於樹結構),具體特性如下:

    • HashSet(基於Hash存儲,查找元素性能優良,應該作為Set實現類的默認選擇)
    • LinkedHashSet(具有HashSet查找元素的性能,內部使用鏈表維護元素有序性)
    • TreeSet(底層基於樹結構,該接口維護元素的有序性,默認按照自然順序排序,也可以自定義排序規則,元素必須實現Comparable接口)

  技術分享圖片

  Queue

   Queue是典型的先進先出(FIFO)容器主要有LinkedList(基於鏈表)Priority(優先級隊列),具體特性如下:

    • PriorityQueue(優先級隊列,可定義排列順序)

  Map

   Map是基於鍵值對的數據結構,可以用鍵來查找值,標準的Java類庫中包含了Map的幾種實現,包括:HashMap、TreeMap、LinkedHashMap、WeakHashMap、ConcurrentHashMap、IdentityHashMap,各自實現類的行為特性各不相同,主要表現在效率、鍵值對的保存及呈現次序、對象的保存周期、映射表如何在多線程程序中工作和判定“鍵”的等價等策略方面。   

    • HashMap(基於Hash存儲,查找元素性能優良,應該作為Map實現類的默認選擇)

    • TreeMap(底層基於樹結構,該接口維護元素的有序性,默認按照自然順序排序,也可以自定義排序規則,元素必須實現Comparable接口)

    • LinkedHashMap(具有HashSet查找元素的性能,內部使用鏈表維護元素有序性)

   技術分享圖片

   HashMap是使用hashCode()進行快速查詢的,此方法能夠顯著提升性能。

  • 集合元素比較

  如前所述,日常開發的許多場景都需要維護元素的有序性,對於Integer、String等基本類型可以采用默認自然排序,但對於對象排序,為了實現對象間的大小比較,通常采用實現Comparable接口和自定義比較器並實現Comparator接口2種方式,詳細用法如下:

    • 實現Comparable接口

  采用這種方式非常接單,只要實現compareTo(T o)方法即可。

public int compareTo(T o);
    • 自定義比較器並實現Comparator接口
int compare(T o1, T o2);

  compareTo(T o)方法和compare(T o1,T o2)方法實現需要定義與目標對象的比較規則,方法返回0表示兩對象相等;返回小於0表示當前對象小於目標對象;返回大於0表示大於目標對象。

    • Comparable接口和Comparator接口應用案例
  • Collection與Collections區別

  java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實現。Collection接口的意義是為各種具體的集合提供了最大化的統一操作方式。

  java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化,就像一個工具類,服務於Java的Collection框架,Collection與Collectins看起來很像,其實有本質的區別,使用過程中要謹慎對待。

  • 完整的容器分析方法

 技術分享圖片

  此圖羅列了完整的集合框架圖 ,日常開發掌握以上的容器實現類足夠了,特定的類查閱官網API即可。

  • 具體實現類源碼分析 

  本文僅僅從宏觀角度去分析了Java標準類庫中集合框架常用接口及其實現類,具體更為細節的源碼分析,將以系列文章的形式呈現,具體鏈接如下:

    • ArrayList源碼分析

集合容器概覽