1. 程式人生 > 其它 >Java常用API_集合類庫(下)

Java常用API_集合類庫(下)

第十五章 集合類庫(下)

15.1 泛型機制(熟悉)

15.1.1 基本概念

  • 通常情況下集合中可以存放不同型別的物件,是因為將所有物件都看做Object型別放入的,因此從集合中取出元素時也是Object型別,為了表達該元素真實的資料型別,則需要強制型別換,而強制型別轉換可能會引發型別轉換異常。
  • 為了避免上述錯誤的發生,從Java5開始增加泛型機制,也就是在集合名稱的右側使用<資料型別>的方式來明確要求該集合中可以存放的元素型別,若放入其它型別的元素則編譯報錯。
  • 泛型只在編譯時期有效,在執行時期不區分是什麼型別。

15.1.2 底層原理

  • 泛型的本質就是引數化型別,也就是讓資料型別作為引數傳遞,其中E相當於形式引數負責位,而使用集合時<>中的資料型別相當於實際引數,用於給形式引數E進行初始化,從而使得集合中所有的E被實際引數替換,由於實際引數可以傳遞各種各樣廣泛的資料型別,因此得名為泛型。
  • 如:

     //其中i叫做形式引數,負責佔位 其中E叫做形式引數,負責佔位
     //int i = 10; E = String;
     //int i = 20; E = Integer;
     public static void show(int i) { public interface List {
        ... ...
     } }
     //其中10叫做實際引數,負責給形式引數初始化 //其中String叫做實際引數
     show(10); List lt1 = ...;
     show(20); List lt2 = ...;

15.1.3 自定義泛型介面

  • 泛型介面和普通介面的區別就是後面添加了型別引數列表,可以有多個型別引數,如:<E, T, .. >等。

15.1.4 自定義泛型類

  • 泛型類和普通類的區別就是類名後面添加了型別引數列表,可以有多個型別引數,如:<E, T, .. >等。
  • 例項化泛型類時應該指定具體的資料型別,並且是引用資料型別而不是基本資料型別。
  • 父類有泛型,子類可以選擇保留泛型也可以選擇指定泛型型別。
  • 子類必須是“富二代”,子類除了指定或保留父類的泛型,還可以增加自己的泛型。

15.1.5 自定義泛型方法

  • 泛型方法就是我們輸入引數的時候,輸入的是泛型引數,而不是具體的引數。我們在呼叫這個泛型方法的時需要對泛型引數進行例項化。
  • 泛型方法的格式:[訪問許可權] <泛型> 返回值型別 方法名([泛型標識 引數名稱]) { 方法體; }
  • 在靜態方法中使用泛型引數的時候,需要我們把靜態方法定義為泛型方法。

15.1.6 泛型在繼承上的體現

  • 如果B是A的一個子類或子介面,而G是具有泛型宣告的類或介面,則G並不是G的子型別!

   比如:String是Object的子類,但是List並不是List的子類。

15.1.7 萬用字元的使用

  • 有時候我們希望傳入的型別在一個指定的範圍內,此時就可以使用泛型萬用字元了。
  • 如:之前傳入的型別要求為Integer型別,但是後來業務需要Integer的父類Number類也可以傳入。
  • 泛型中有三種萬用字元形式:
    • <?> 無限制萬用字元:表示我們可以傳入任意型別的引數。
    • <? extends E> 表示型別的上界是E,只能是E或者是E的子類。
    • <? super E> 表示型別的下界是E,只能是E或者是E的父類。

15.2 Set集合(熟悉)

15.2.1 基本概念

  • java.util.Set集合是Collection集合的子集合,與List集合平級。
  • 該集合中元素沒有先後放入次序,且不允許重複。
  • 該集合的主要實現類是:HashSet類 和 TreeSet類以及LinkedHashSet類。
  • 其中HashSet類的底層是採用雜湊表進行資料管理的。
  • 其中TreeSet類的底層是採用紅黑樹進行資料管理的。
  • 其中LinkedHashSet類與HashSet類的不同之處在於內部維護了一個雙向連結串列,連結串列中記錄了元素的迭代順序,也就是元素插入集合中的先後順序,因此便於迭代。

15.2.2 常用的方法

  • 參考Collection集合中的方法即可!
  • 案例題目:  
    •   準備一個Set集合指向HashSet物件,向該集合中新增元素"two"並列印,再向集合中新增元素"one"並列印,再向集合中新增元素"three"並列印,再向集合中新增"one"並列印。

15.2.3 元素放入HashSet集合的原理

  • 使用元素呼叫hashCode方法獲取對應的雜湊碼值,再由某種雜湊演算法計算出該元素在陣列中的索引位置。
  • 若該位置沒有元素,則將該元素直接放入即可。
  • 若該位置有元素,則使用新元素與已有元素依次比較雜湊值,若雜湊值不相同,則將該元素直接放入。
  • 若新元素與已有元素的雜湊值相同,則使用新元素呼叫equals方法與已有元素依次比較。
  • 若相等則新增元素失敗,否則將元素直接放入即可。
  • 思考:為什麼要求重寫equals方法後要重寫hashCode方法呢?
  • 解析:
    •   當兩個元素呼叫equals方法相等時證明這兩個元素相同,重寫hashCode方法後保證這兩個元素得到的雜湊碼值相同,由同一個雜湊演算法生成的索引位置相同,此時只需要與該索引位置已有元素比較即可,從而提高效率並避免重複元素的出現。

15.2.5 TreeSet集合的概念

  • 二叉樹主要指每個節點最多隻有兩個子節點的樹形結構。
  • 滿足以下3個特徵的二叉樹叫做有序二叉樹。由於TreeSet集合的底層採用紅黑樹進行資料的管理,當有新元素插入到TreeSet集合時,需要使用新元素與集合中已有的元素依次比較來確定新元素的合理位置。
    •   a.左子樹中的任意節點元素都小於根節點元素值;
    •   b.右子樹中的任意節點元素都大於根節點元素值;
    •   c.左子樹和右子樹的內部也遵守上述規則;
  • 比較元素大小的規則有兩種方式:自然排序的規則比較單一,而比較器的規則比較多元化,而且比較器優先於自然排序;
    •   使用元素的自然排序規則進行比較並排序,讓元素型別實現java.lang.Comparable介面;
    •   使用比較器規則進行比較並排序,構造TreeSet集合時傳入java.util.Comparator介面;

15.3 Map集合(重點)

15.3.1 基本概念

  • java.util.Map<K,V>集合中存取元素的基本單位是:單對元素,其中型別引數如下:該集合中key是不允許重複的,而且一個key只能對應一個value。
    •   K - 此對映所維護的鍵(Key)的型別,相當於目錄。
    •   V - 對映值(Value)的型別,相當於內容。
  • 該集合的主要實現類有:HashMap類、TreeMap類、LinkedHashMap類、Hashtable類、Properties類。
  • 其中HashMap類的底層是採用雜湊表進行資料管理的。
  • 其中TreeMap類的底層是採用紅黑樹進行資料管理的。
  • 其中LinkedHashMap類與HashMap類的不同之處在於內部維護了一個雙向連結串列,連結串列中記錄了元素的迭代順序,也就是元素插入集合中的先後順序,因此便於迭代。
  • 其中Hashtable類是古老的Map實現類,與HashMap類相比屬於執行緒安全的類,且不允許null作為key或者value的數值。
  • 其中Properties類是Hashtable類的子類,該物件用於處理屬性檔案,key和value都是String型別的。
  • Map集合是面向查詢優化的資料結構, 在大資料量情況下有著優良的查詢效能。
  • 經常用於根據key檢索value的業務場景。

15.3.2 常用的方法

15.3.3 元素放入HashMap集合的原理

  • 使用元素的key呼叫hashCode方法獲取對應的雜湊碼值,再由某種雜湊演算法計算在陣列中的索引位置。
  • 若該位置沒有元素,則將該鍵值對直接放入即可。
  • 若該位置有元素,則使用key與已有元素依次比較雜湊值,若雜湊值不相同,則將該元素直接放入。
  • 若key與已有元素的雜湊值相同,則使用key呼叫equals方法與已有元素依次比較。
  • 若相等則將對應的value修改,否則將鍵值對直接放入即可。

15.3.4 相關的常量

  • DEFAULT_INITIAL_CAPACITY : HashMap的預設容量是16。
  • DEFAULT_LOAD_FACTOR:HashMap的預設載入因子是0.75。
  • threshold:擴容的臨界值,該數值為:容量*填充因子,也就是12。
  • TREEIFY_THRESHOLD:若Bucket中連結串列長度大於該預設值則轉化為紅黑樹儲存,該數值是8。
  • MIN_TREEIFY_CAPACITY:桶中的Node被樹化時最小的hash表容量,該數值是64。

15.4 Collections類

15.4.1 基本概念

  • java.util.Collections類主要提供了對集合操作或者返回集合的靜態方法。

15.4.2 常用的方法