1. 程式人生 > >Java容器---基本概念

Java容器---基本概念

一個 reac 通過 java容器 list 相同 -i order 元素

1.持有對象

Java容器類類庫的用途是“保存對象”,並將其劃分為兩個不同的概念:

(1) Collection: 一個獨立元素的序列,這些元素都服從一條或多條規則。List必須按照插入的順序保存元素,而Set不能有重復元素。Queue按照排隊規則來確定對象產生的順序(通常與它們被插入的順序相同)。

(2)Map: 一組成對的“鍵值對”對象,允許你使用鍵來查找值。ArrayList允許你使用數字來查找值,因此在某種意義上講,它將數字與對象關聯在了一起。映射允許我們使用另一個對象來查找某個對象,它也被稱為“關聯數組”,因為它將某些對象與另外一些對象關聯在了一 起,或者被稱為“字典”,因為你可以使用鍵對象來查找值對象,就像在字典中使用單詞來定義 一樣。

技術分享圖片

2.面向接口的編程思想

Map是強大的編程工具。盡管並非總是這樣,但是在理想情況下,你編寫的大部分代碼都是在與這些接口打交道 並且你唯一需要指定所使用的精確類型的地方就是在創建的時候。你可以像下面創建一個List:

List<Apple> apples = new Arraylist<Apple>();

因此,你應該創建一個具體類的對象,將其轉型為對應的接口,然後在其余的代碼中都使用這個接口。這種方式並非總能奏效,因為某些類具有額外的功能,例如,LinkedList具有在List接口中未包含的額外方法,而TreeMap也具有在Map接口中未包含的方法。如果你需要使用這些方法,就不能將它們向上轉型為更通用的接口。

3.泛型和類型安全的容器

使用Java SE5之前的容器的一個主要問題就是編譯器允許你向容器中插入不正確的類型。例如,考慮一個Apple對象的容器,我們使用最基本最可靠的容器ArrayList。現在,你可以把ArrayList當作 “可以自動擴充自身尺寸的數組” 來看待。使用ArrayList相當簡單:創建一個實例,用add()插入對象,然後用get()訪問這些對象,此時需要使用索引,就像數組一樣,但是不需要方括號。ArrayList還有一個size()方法,使你可以知道已經有多少元素添加了進來,從而不會不小心因素引越界而引發錯誤。

如果我們把AppleOrange

都放置在了容器中,然後將它們取出。正常情況下,Java編譯器會報告警告信息,因為沒有使用泛型。Apple和Orange類是有區別的,它們除了都是Object之外沒有任何共性( 如果一個類沒有顯式地聲明繼承自哪個類,那麽它自動地繼承自Object的)。因為 ArrayList保存的是 Object, 因此你不僅可以通過ArrayList的add()方法將Apple對象放進這個容器,還可以添加 Orange對象,而且無論在編譯期還是運行時都不會有問題。

But,當你在使用ArrayList的get()方法來取出你認為是 Apple的對象時,你得到的只是 Object的引用, 必須將其轉型為Apple,因此,需要將整個表邊式括起來, 在調用Apple的id()方法之前,強制執行轉型。否則,你就會得到語法錯誤。在運行時,當你試圖將Orange對象轉型為Apple肘,你就會以前面提及的異常的形式得到一個錯誤。

使用Java泛型來創建類會比較復雜。但是,應用預定義的泛型通常會很簡單。例如,要想定義用來保存Apple對象的ArrayList ,你可以聲明 ArrayList<Apple>,而不僅僅只是ArrayList ,其中尖括號括起來的是類型參數(可以有多個), 它指定了這個容器實例可以保存的類型。通過使用泛型, 就可以在編譯期防止將錯誤類型的對象放置到容器中。

List<Apple> apples = new Arraylist<Apple>();

現在, 編譯器可以阻止你將Orange放置到apples中, 因此它變成了一個編譯期錯誤,而不再是運行時錯誤。 你還應該註意到, 在將元素從List中取出肘, 類型轉換也不再是必需的了。 因為List知道它保存的是什麽類型, 因此它會在調用get()時替你執行轉型。 這樣, 通過使用泛型, 你不僅知道編譯器將會檢查你放置到容器中的對象類型, 而且在使用容器中的對象時, 可以使用更加清晰的語法。

所有的Collection都可以用foreach語法遍歷,但是被稱為“叠代器”類會的更靈活。

技術分享圖片

2018-01-01 內容來自《Java編程思想》

Java容器---基本概念