Java集合容器的深度理解
Java容器裡有很多寫好的容器API,這使我們很方便的可以儲存、操作我們的資料。
下面是我寫的容器的特點,一些容器的不同之處,從底層原始碼解析一下容器實現原理
一、常用的容器目錄
上圖可以看出,java容器分為兩種:Collection和Map
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
一般用於的Map應該提供兩個建構函式:
1.無參建構函式,建立一個空的Map
2.有一個形參為Map的建構函式,既複製一個Map
Map的實現類對所包含的元素會有不同的限制,HashTable的鍵和值都不允許為null,HashMap的鍵和值都允許為null
二、List
從此圖看出List繼承的是Collection集合介面,List最大特點就是所有的元素是可重複的,List介面在Collection的基礎上增加了很多的方法.List
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在插入元素時保持元素順序
(文章有待補充,哪裡沒有解釋到位,請指出)