1. 程式人生 > >走進Java中的持有物件(容器類)之一 容器分類

走進Java中的持有物件(容器類)之一 容器分類

轉載自 https://www.cnblogs.com/ACFLOOD/p/5555555.html

Java容器可以說是增強程式設計師程式設計能力的基本工具,本系列將帶您深入理解容器類。

  1. 容器的用途

如果物件的數量與生命週期都是固定的,自然我們也就不需要很複雜的資料結構。

我們可以通過建立引用來持有物件,如

Class clazz;

也可以通過陣列來持有多個物件,如

Class[] clazs = new Class[10];

然而,一般情況下,我們並不知道要建立多少物件,或者以何種方式建立物件。陣列顯然只能建立固定長度的物件,為了使程式變得更加靈活與高效,Java類庫提供了一套完整的容器類,具備完善的方法來解決上述問題。

 

    2.  容器的類別

觀察上圖,我們可以得出容器主要分為兩種型別,兩個介面Collection與Map定義了兩類不同的物件儲存方式。

Collection用以儲存單一的元素,Map儲存關聯鍵值對。通過泛型來指定容器存放的資料型別。 Iterator 設計的目的是在未知容器具體的型別的情況下,用來遍歷容器元素。剩下的容器型別都是繼承了這兩個介面。

在實際編碼中,通過向上轉型為介面,在其與程式碼中都使用這個介面是非常普遍的使用方式。如下:

 

複製程式碼

import java.util.*;

public class TestCollection {

    public static void main(String[] args){

        Collection<Integer> c = new ArrayList<Integer>();

        for(int i = 0; i < 10; i++){

            c.add(i);    

        }

        for(Integer i : c){

            System.out.print(i + ", ");

        }

    }

}

 

複製程式碼

 

注:由於List介面的方法比Collection更為豐富,所以 實際應用中,ArrayList向上轉型為List更為合適。

剛剛接觸容器的朋友們可能會只把Collection與Map當做介面,實際上並非如此,容器中的介面其實有六個。

     

    3.  容器中的七大介面

  1. Collection介面

  2. Map介面

  3. Set介面

  4. List介面

  5. Queue介面

  6. Iterator介面

  7. Comparable介面

其中List, Queue和Set介面繼承了Collection介面

,剩下的介面之間都是相互獨立的,無繼承關係。List和Set介面主要是為了區分是否要包含重複元素,Iterater迭代器則是為了更靈活的迭代集合,與foreach一起使用。Comparable介面則用於比較。

 

    4.  各類容器的功能(主要實現類分析)

  • Collection介面

    • List介面(相比Collection, 添加了新的方法)

      • ArrayList

                    實現List介面,類似於動態陣列,適用於大量隨機訪問的情況。但插入和刪除的代價非常高昂

  • LinkedList

                          實現List介面,類似於連結串列,也提供了優化的順序訪問。在插入和刪除方面代價低廉,隨機訪問代價較高

  • Set介面(方法與Collection完全相同)

    • HashSet

                        HashSet使用了雜湊函式實現,極大的提高了訪問速度。存入HashSet的物件必須定義hashCode()

 

複製程式碼

import java.util.*;

public class IntegerSet{

  private static Random rand;

   public static void main(String[] args){

     rand = new Random(47);

      Set<Integer> intset = new HashSet<Integer>();

      for(int i = 0; i < 10000; i++){

          intset.add(rand.nextInt(30));

      }

      System.out.println(intset);

  }

}

複製程式碼

 

                         本例中,intset中插入了10000次,由於不保留重複元素最後輸出結果數目<=30。

  • TreeSet

                         TreeSet使用紅黑樹來實現儲存元素, 紅黑樹的好處是可以插入之後維持集合的有序性。                               

 

複製程式碼

import java.util.*;

public class SortIntegerSet {

  private static Random rand;

   public static void main(String[] args) {

     rand = new Random(47);

     Set<Integer> sintset = new TreeSet<Integer>();

       for(int i = 0; i < 10000; i++){

          sintset.add(rand.nextInt(20));

       }

       System.out.println(sintset);

  }

}

複製程式碼

 

  • LinkedHashSet

                          顧名思義,LinkedHashSet使用了連結串列來保持插入順序,不過為了提高查詢效率,也使用了雜湊

  • Queue介面

    • LinkedList

                        LinkedList實現了Queue介面,提供了方法支援佇列的行為,在以後的系列我們會深入講解如何用               

                 LinkedList實現佇列。

  • PriorityQueue

                         與普通佇列不同,優先佇列每次彈出的是優先順序最高的元素。可以通過提供自己的Comparator來修改     

                 預設的優先順序順序。       

  • Map介面

    • HashMap

             HashMap通過雜湊機制,用來快速訪問

  • TreeMap

                TreeMap保持"key"處於排序狀態,訪問速度不如HashMap

  • LinkedHashMap

                LinkedHashMap保持元素插入時順序,同時提供雜湊實現快速訪問

    關於Map的雜湊實現是非常重要的,實現Map的原理(關聯陣列等),hashCode()方法的理解,本系列後面會一一分析。

 

    5.  總結

通過本文的學習,相信讀者對容器的用途,分類,以及容器的層次結構與一些常用容器的基本功能和用法有了較為清晰地瞭解。然而,想要更好的使用容器類,還必須瞭解每種容器具體的方法,原始碼,以及執行緒安全的實現。在本系列的後續部分,將帶大家繼續深入討論這些內容。