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

来源:http://www.cnblogs.com/ACFLOOD/archive/2016/06/03/5555555.html
-Advertisement-
Play Games

Java容器可以說是增強程式員編程能力的基本工具,本系列將帶您深入理解容器類。 容器的用途 如果對象的數量與生命周期都是固定的,自然我們也就不需要很複雜的數據結構。 我們可以通過創建引用來持有對象,如 也可以通過數組來持有多個對象,如 然而,一般情況下,我們並不知道要創建多少對象,或者以何種方式創建 ...


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

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

如果覺得本文對您有所幫助的話,就給俺推薦一個吧~

作者:I'm coding
鏈接:http://www.cnblogs.com/ACFLOOD/
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 引言 一個項目的通常都是從Demo開始,不斷為項目添加新的功能以及重構,也許剛開始的時候代碼顯得非常凌亂,毫無設計可言。但是隨著項目的迭代,往往需要將很多相同功能的代碼抽取出來,這也是設計模式的開始。熟練運用設計模式應該是每一個軟體開發人員的必備技能。今天給大家介紹幾個常用的設計模式。 2. ... ...
  • 作為一個豬拱性能的程式猿,不會使用fiddler來協助自己分析問題是萬萬不能的。還記得剛入職的時候老大提過的幾個必須要熟練使用的工具中第一個就是fiddler。雖然接觸了快一年了,但是還是一知半解的。下午找同事幫忙分析了個記憶體溢出的問題,剛學了一招如何使用fiddler來分析oom類問題。當然以下內 ...
  • 問題背景:在使用普通的SelfHost時,調用其它工程的dll(其實就是把WebApi寫到一個單獨的工程方便管理),通過載入其他工程的dll然後再訪問webapi是沒有問題的。 但是在使用Owin SelfHost時,調用其它工程的dll,訪問WebApi時會拋出No type was found ...
  • 輔助器方法 在開發ASP.NET MVC項目時,經常會用到輔助器方法,它能夠提供很多遍歷的工作,比如可以對代碼塊和標記進行打包等。下麵通過新建一個示例項目來看看其在實際使用中的情況。 示例項目 項目名:HelperMethods 模板:Basic(基本) 項目名:HelperMethods 模板:B ...
  • 前言 最近這段時間除了工作,所有的時間都是在移植我以前實現的一個Owin框架,相當移植到到Core的話肯定會有很多坑,這個大家都懂,以後幾篇文章可能會圍繞這個說下,暫時就叫《Dotnet Core踩坑記》吧,呵呵。 接下來我對我在移植過程中發現的一些問題進行了總結,今天主要說說Owin。說到Owin ...
  • 創建自定義視圖引擎 一般情況下直接使用MVC框架自帶的內建視圖引擎即可,但如果想知道視圖引擎是如何工作的,就需要從建立一個自定義視圖引擎開始了。通過之前的學習我們都知道了內建視圖引擎包括Razor和ASPX兩種,ASPX是針對舊版本MVC程式的,他主要是維護舊版本MVC應用程式,保持系統的相容性而保 ...
  • 我們可以使用jdk內置的 Locale 類來實現java語言的國際化。使用方法很簡單: 命名格式為: xxx_語言代碼_國家代碼 我們這裡 用到了 中英文名稱為: RetrievingRequestXMLError=Error retrieving requestXML from HTTP POST ...
  • #include <iostream>#include <algorithm>#include <map> using namespace std; int main() { int n, i, *arr1, *arr2; map<int, int> match; while(cin>>n) { a ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...