JAVA的主要集合類的數據結構

集合類的大體分類:List,Map和Set。數組

1、 List

  1. ArrayList

    ArrayList維護着一個對象數組。若是調用new ArrayList()後,它會默認初始一個size=10的數組。
    每次add操做都要檢查數組容量,若是不夠,從新設置一個初始容量1.5倍大小的新數組,而後再把每一個元素copy過去。
    在數組中間插入或刪除,都要移動後面的全部元素。(使用System.arraycopy())
  2. LindedList
    LinkedList的實現是一個雙向鏈表。每一個節點除含有元素外,還包含向前,向後的指針。
    新建一個LinkedList,生成一個頭節點(header,就是一個頭指針),它的元素爲null。

    它自包含,next和previous指針都指向本身。執行add(Object obj)方法後,會生成一個新節點:

    Header節點的next指向鏈表的第一個節點,previous指向鏈表的最後一個節點,在這裏都是first。再增長一個對象,它的形狀像下面這樣:

    如今是一個標準的雙向鏈表形狀。每一個節點都有本身的next和previous指針。增長節點,只會對鏈表的指針進行操做,速度快。
    LinkedList實現了Deque,因此它有雙向隊列的特徵,在鏈表兩端可增刪數據。使用index查找對象時,會以index和size/2比較,從前或從後向中間搜索。ListIterator可向前或向後迭代。
    比較ArrayList和LinkedList的結構,就能夠得出:
    (1) ArrayList的remove和add(index, Object)操做代價高,須要移動後面的每一個元素。
    (2) LinkedList的get(index)操做代價高,它要先循環遍歷list,找到Object

2、 Map

  1. HashMap
    HashMap的結構是一個散列桶,初始化時生成以下結構:

    每一個bucket包含一個Entry(map自定義的一種結構,包含一個日後的指針)的鏈表。在put(key, value)後,它的結構以下:

    將key的hashcode再次散列,而後用這個hash和length-1進行按位與操做,獲得bucket的index,而後檢查當前bucket的鏈表,有沒有這個key,若是有替換value,沒有則跟在鏈表的最後。
    容許key和value均可以是null
    Index=0的bucket存key=null的value,也能夠是其它hashcode爲0的項。
    初始容量必須爲2的冪次(個人理解是,在生成index的時候有這樣的代碼:hase ^ (length - 1)),length – 1的二進制代碼爲全1,則容易進行hash的設計)。
    若是兩個key散列後的index同樣的話,第一個key生成的Entry先存在桶中,第二個key生成的Entry會將第一個Entry設爲本身的next,串起來。(如圖中,先put(yy, 「first」),會將這個Entry設爲bucket的第一項,後put(xx,」second」),則生成新Entry,它的next爲key爲yy的Entry,生成一個鏈表)。
    在put操做中,會比較threshold(capacity * load_factor,一個臨界值),若是size > threshold的話,生成一個當前bucket兩倍數量的buckets,而後把現有的數據從新散列到新bucket中。
    對HashMap迭代時,返回數據的順序是:index從0到length-1,循環遍歷每一個bucket,把不爲null的數據取出,每一個bucket內的順序由鏈表的順序決定。而不是由插入數據決定。
  2. LinkedHashMap
    上面說過,Map的迭代不禁插入順序決定。若是要保持這種順序呢?就要新增長一種結構來保持。

    LinkedHashMap是HashMap的子類,增長一個雙向鏈表,用來存儲每一個新加入的節點。在遍歷時,按鏈表的順序進行。其實差很少就是上面HashMap和LinkedList的和吧。

3、Set

  1. HashSet
    HashSet使用HashMap來保持元素。Key = 元素,value是一個公有的對象,對每一個元素都同樣,在HashMap裏面key是唯一的,固然很適合於構造set集合。等同於用HashMap包裝了次,顯示Set本身的特性。
    最後還要提到集合類裏面一個很重要的類:Collections,它有不少本身獨特的靜態方法。固然它主要提供幾種特殊集合(List, Map,Set),能夠調用靜態方法來得到:Unmodifiable(不可修改集合,不可添加或刪除元素),Synchronize(保持同步集合,它的基本每一個方法都加鎖,防止併發操做),Checked(聲明之始傳入特定類型,之後的操做都會驗證加入元素是否屬於已定類型),Singleton(集合中只包含一個元素)。它們都是經過包裝集合類中的抽象類得到,產生不一樣的行爲。
相關文章
相關標籤/搜索