走進Java中的持有對象(容器類)之一 容器分類

Java容器能夠說是加強程序員編程能力的基本工具,本系列將帶您深刻理解容器類。 java

  1. 容器的用途

若是對象的數量與生命週期都是固定的,天然咱們也就不須要很複雜的數據結構。 程序員

咱們能夠經過建立引用來持有對象,如 編程

Class clazz;

也能夠經過數組來持有多個對象,如 數組

Class[] clazs = new Class[10];

然而,通常狀況下,咱們並不知道要建立多少對象,或者以何種方式建立對象。數組顯然只能建立固定長度的對象,爲了使程序變得更加靈活與高效,Java類庫提供了一套完整的容器類,具有完善的方法來解決上述問題。 安全

 

    2.  容器的類別 數據結構

 

觀察上圖,咱們能夠得出容器主要分爲兩種類型,兩個接口Collection與Map定義了兩類不一樣的對象存儲方式。 dom

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.  總結

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

若是以爲本文對您有所幫助的話,就給俺推薦一個吧~

做者:I'm coding
連接:http://www.cnblogs.com/ACFLOOD/
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

相關文章
相關標籤/搜索