<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 集合 通常,我們并不知道解決某個具體問題需要的對象數量和持續時間,以及對象的存儲方式。那么我們如何知悉程序在運行時需要分配的內存空間呢? 在面向對象的設計中,問題的解決方案有些過于輕率:創建一個新類型的對象來引用、容納其他的對象。當然,我們也可以使用多數編程語言都支持的“數組”(array)。在 Java 中“集合”(Collection)的使用率更高。(也可稱之為“容器”,但“集合”這個稱呼更通用。) “集合”這種類型的對象可以存儲任意類型、數量的其他對象。它能根據需要自動擴容,我們不用關心過程是如何實現的。 還好,一般優秀的 OOP 語言都會將“集合”作為其基礎包。在 C++ 中,“集合”是其標準庫的一部分,通常被稱為 STL(Standard Template Library,標準模板庫)。SmallTalk 有一套非常完整的集合庫。同樣,Java 的標準庫中也提供許多現成的集合類。 在一些庫中,一兩個泛型集合就能滿足我們所有的需求了,而在其他一些類庫(Java)中,不同類型的集合對應不同的需求:常見的有 List,常用于保存序列;Map,也稱為關聯數組,常用于將對象與其他對象關聯;Set,只能保存非重復的值;其他還包括如隊列(Queue)、樹(Tree)、棧(Stack)、堆(Heap)等等。從設計的角度來看,我們真正想要的是一個能夠解決某個問題的集合。如果一種集合就滿足所有需求,那么我們就不需要剩下的了。之所以選擇集合有以下兩個原因: 1. 集合可以提供不同類型的接口和外部行為。堆棧、隊列的應用場景和集合、列表不同,它們中的一種提供的解決方案可能比其他靈活得多。 2. 不同的集合對某些操作有不同的效率。例如,List 的兩種基本類型:ArrayList 和 LinkedList。雖然兩者具有相同接口和外部行為,但是在某些操作中它們的效率差別很大。在 ArrayList 中隨機查找元素是很高效的,而 LinkedList 隨機查找效率低下。反之,在 LinkedList 中插入元素的效率要比在 ArrayList 中高。由于底層數據結構的不同,每種集合類型在執行相同的操作時會表現出效率上的差異。 我們可以一開始使用 LinkedList 構建程序,在優化系統性能時改用 ArrayList。通過對 List 接口的抽象,我們可以很容易地將 LinkedList 改為 ArrayList。 在 Java 5 泛型出來之前,集合中保存的是通用類型 `Object`。Java 單繼承的結構意味著所有元素都基于 `Object` 類,所以在集合中可以保存任何類型的數據,易于重用。要使用這樣的集合,我們先要往集合添加元素。由于 Java 5 版本前的集合只保存 `Object`,當我們往集合中添加元素時,元素便向上轉型成了 `Object`,從而丟失自己原有的類型特性。這時我們再從集合中取出該元素時,元素的類型變成了 `Object`。那么我們該怎么將其轉回原先具體的類型呢?這里,我們使用了強制類型轉換將其轉為更具體的類型,這個過程稱為對象的“向下轉型”。通過“向上轉型”,我們知道“圓形”也是一種“形狀”,這個過程是安全的。可是我們不能從“Object”看出其就是“圓形”或“形狀”,所以除非我們能確定元素的具體類型信息,否則“向下轉型”就是不安全的。也不能說這樣的錯誤就是完全危險的,因為一旦我們轉化了錯誤的類型,程序就會運行出錯,拋出“運行時異常”(RuntimeException)。(后面的章節會提到) 無論如何,我們要尋找一種在取出集合元素時確定其具體類型的方法。另外,每次取出元素都要做額外的“向下轉型”對程序和程序員都是一種開銷。以某種方式創建集合,以確認保存元素的具體類型,減少集合元素“向下轉型”的開銷和可能出現的錯誤難道不好嗎?這種解決方案就是:參數化類型機制(Parameterized Type Mechanism)。 參數化類型機制可以使得編譯器能夠自動識別某個 `class` 的具體類型并正確地執行。舉個例子,對集合的參數化類型機制可以讓集合僅接受“形狀”這種類型的元素,并以“形狀”類型取出元素。Java 5 版本支持了參數化類型機制,稱之為“泛型”(Generic)。泛型是 Java 5 的主要特性之一。你可以按以下方式向 ArrayList 中添加 Shape(形狀): ```java ArrayList<Shape> shapes = new ArrayList<>(); ``` 泛型的應用,讓 Java 的許多標準庫和組件都發生了改變。在本書的代碼示例中,你也會經常看到泛型的身影。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看