1. 程式人生 > 其它 >Java集合容器的深度理解

Java集合容器的深度理解

Java容器裡有很多寫好的容器API,這使我們很方便的可以儲存、操作我們的資料。

下面是我寫的容器的特點,一些容器的不同之處,從底層原始碼解析一下容器實現原理

一、常用的容器目錄

  

上圖可以看出,java容器分為兩種:CollectionMap

Collection:主要是單個元素的集合,由List、Queue、Set三個介面區分不同的集合特徵,然後由下面的具體的類來實現對應功能,然後Collection還繼承了Iterable(為集合提供了for-each迴圈的支援,是一個可以為不同的集合類提供遍歷的最佳方式)迭代器

 Map:有一組鍵值對的儲存形式來儲存,可以用鍵物件來查詢值.

Map裡的K-key(金鑰型別),v-value(對映值的型別)

  簡介:

    1.Map是java集合框架的根介面,另一個是Collection的介面

    2.一個Map中,不能包含重複的Key,一個Key只能對映到一個value

Map本身並不是一種集合,但是Map可以提供三種集合檢視:

    1.Key——value對映Set檢視

    2.Key的Set檢視

    3.value的Collection檢視

注意!!:如果一個可變(Mutable)物件作為Map的key,需要特別注意,如果這個物件的修改影響到了equals比較,那Map的行為是不明確的。針對此種情況有一個很好的示例,Map

不允許將自身作為key,因           為這種情況下,equals()和hashcode()不能被很好地定義。

一般用於的Map應該提供兩個建構函式:

    1.無參建構函式,建立一個空的Map

    2.有一個形參為Map的建構函式,既複製一個Map

    Map的實現類對所包含的元素會有不同的限制,HashTable的鍵和值都不允許為null,HashMap的鍵和值都允許為null

二、List

 從此圖看出List繼承的是Collection集合介面,List最大特點就是所有的元素是可重複的,List介面在Collection的基礎上增加了很多的方法.List

主要分為ArrayListLinkedList,前者的底層是使用陣列實現的

List,後者是使用連結串列實現的List,還有一個Vector,它是一個被棄用的類,因為它是執行緒同步的,而我們平常使用的時候都是非同步的,使用同步的壞處就是會在一個記錄上加鎖,防止多個程式訪問同一條數

據導致資料不同步.這樣會導致訪問速度變慢

 Stack是滿足"後進先出"規則的容器,注意LinkedList可以實現所有棧的功能

1).ArrayList

  1.ArrayList是一個可以動態增長的陣列

  2.我們都知道Java中的陣列一旦指定了長度就不可變了,如果我們在業務中需要使用動態的陣列,就可以使用ArrayList(預設長度是10,如果插入的資料超過了10,ArrayList會不斷的自我增長)

  3.ArrayList由於底層是使用陣列實現的,所以隨機訪問速度快,插入刪除慢

   

  我們可以看到在ArrayList裡的底層有EMPTY_ELEMENTDATA 這一段原始碼,它的作用是為了優化建立ArrayList空例項時產生不必要的空陣列,使得所有ArrayList空例項都指向同一個空陣列。       DEFAULTCAPACITY_EMPTY_ELEMENTDATA是為了確保無參構成函式建立的例項在新增第一個元素時,最小的容量是預設大小10。

2.)LinkedList

  LinkedList是使用連結串列實現的容器。

  在列表中插入和刪除速度快,但是查詢需要遍歷整個連結串列,速度較慢

  使用LinkedList可以實現很多佇列、棧的資料結構,並且有很多方法很類似,但是有細小的差別

  • getFirst和element都返回列表的頭,但是不刪除它,如果列表為空,丟擲異常
  • peek實現的功能一樣,但是列表為空時返回null
  • removeFirst和remove都是刪除並返回列表的頭,如果列表為空丟擲異常
  • pool實現的功能一樣,但是列表為空時返回null

3.)Queue

  佇列是一個滿足“先進先出”的資料結構。
  LinkedList提供了方法支援佇列操作,並且實現了Queue介面,所以LinkedList是佇列的一種實現,可以通過LinkedList向上轉型為Queue

  • offer:講一個元素插入對尾
  • peek:不移除的情況下將元素插入隊尾,佇列為空返回null
  • element:不移除的情況下將元素插入隊尾,佇列為空報錯
  • poll:移除並返回隊頭,佇列為空返回null
  • remove:不移除的情況下將元素插入隊尾,佇列為空報錯

  4.)Set

  • Set不允許出現重複元素-----------無重複
  • Set不保證集合中元素的順序---------無序
  • Set允許包含值為null的元素,但最多隻能有一個null元素。
  • Set支援泛型(型別的引數化),我們應儘可能使用它。將Generics與List一起使用將在執行時避免ClassCastException。
  • 先去看Map,Set的實現類都是基於Map來實現的(如,HashSet是通過HashMap實現的,TreeSet是通過TreeMap實現的,LinkedHashSet是通過LinkedHashMap來實現的)。

  (LinkedHashSet

  集合框架提供LinkedHashSet類作為Set介面的另一個實現類

  HashSet不保證順序元素.LinkedHashSet在插入元素時保持元素順序

                                                                       (文章有待補充,哪裡沒有解釋到位,請指出)