340 likes | 407 Views
第 12 章 集合與泛型. 12-1 集合與陣列的比較 12-2 Collection介面與Collections類別 12-3 泛型 12-4 各種集合的特色 12-5 Map的功能與架構. 12-1 集合與陣列的比較. 12-2 Collection介面與Collections類別. java.util.Collection介面是整個集合架構的根介面 。. 輸出結果 元素總數: 3 集合內容: 1 true Java 移除 1 個元素之後 ... 集合內容: 1 Java 集合是否被清空? true. 範例說明
E N D
第12章 集合與泛型 12-1 集合與陣列的比較 12-2 Collection介面與Collections類別 12-3 泛型 12-4 各種集合的特色 12-5 Map的功能與架構
12-2 Collection介面與Collections類別 java.util.Collection介面是整個集合架構的根介面。
輸出結果 元素總數:3 集合內容:1 true Java 移除1個元素之後... 集合內容:1 Java 集合是否被清空?true • 範例說明 • 第5~7行:將物件一一加入集合內,而基本類型都會先AutoBoxing成對應的物件型後才加入。 • 第8行:取得元素總數。 • 第10行:取出時的類型是Object。 • 第13行:移除「true」元素。 • 第16~20行:取得Iterator物件後,可透過該物件走訪所有集合的元素。 • 第21行:清空集合內容物。 • 第22行:檢查集合是不是空的容器。
Collections類別 java.util.Collections類別提供許多與集合相關的static方法,例如排序與搜尋。 • 注意 • 執行排序時:(1)元素資料類型必須一致(2)元素不可為null值。 • 執行搜尋時:必須先排序。
輸出結果 元素升冪排序後:[AA, Aa, a, aa] 「aa」的索引:3 元素反轉後:[aa, a, Aa, AA] • 範例說明 • 第9行:Collections只能幫List集合排序。 • 第12行:排序完畢後方能呼叫binarySearch()方法。搜尋到"aa"值後回傳所在索引。 • 第14行:reverse()方法會將元素順序反轉。
12-3 泛型 1個屬性往往不止於1種資料類型,例如之前的Book類別,其price屬性就有可能是整數、小數或是文字類型;這樣一來,程式會變成複雜難懂。要解決這種問題,泛型(Generics)是最佳選擇。
輸出結果 書籍定價為:580 書籍定價為:五百八十 書籍定價為:580.0 • 範例說明 • 第2行:price屬性設為T類型。 • 第12行:將T指定為Integer類型。 • 第21~23行:如果宣告時不指定T的類型,那就是什麼類型都接受,所以會取得Object類型的值。
注意 前範例第21行沒有指定T的類型,編譯會跳出警示訊息:
泛型的進階設定 泛型的設定也可以使用「?」搭配「extends」或「super」來增加設定上的彈性。
輸出結果 書籍定價為:580 • 範例說明 • 第3行:T的類型可以是Number或其子類別。 • 第10行:指定T的類型是Integer。 • 第12行:book物件其泛型T的設定是Integer,符合第3行規定,所以可以呼叫第3行的show()方法。
泛型應用在集合上 集合搭配泛型就可限制元素的資料類型;而且元素取出後也會與當初限制的資料類型相同。
輸出結果 總和 = 6 • 範例說明 • 第12、16行:限制元素為Integer類型,第16行不可加入String物件。 • 第17行:集合c的泛型設定是Integer,符合第3行規定。 • 第5行:集合c的元素是Integer物件,取出之後可以直接指派給i。 • 第6行:i會先AutoUnboxing,然後與sum相加。
12-4 各種集合的特色 Set集合 Set集合有2個特色,而HashSet是Set集合的子類別,所以有相同特色: 1. 元素值不重複。 2. 元素無順序性。
輸出結果 是否新增成功?false [SCWCD, SCJP] • 範例說明 • 第7行:第5行已加入了"SCJP",所以無法再加入一次。
equals()、hashCode()方法的改寫 • Object類別定義了equals()方法,子類別需改寫此方法以判斷2個物件是否值相同;如果不改寫則一律回傳false。equals()方法屬於精準比對,所以執行效能較差;為了提升比對速度,還要改寫Object類別的hashCode()方法。 • Set集合要新增元素時,會自動執行下列步驟: • 呼叫hashCode():得到的整數值不同,直接認定 • 這2個物件值不同,而不再呼叫equals()來比對。 • 呼叫equals():如果得到false,代表值不同。
改寫hashCode()方法規則有3項,第1、2項一定要遵從,第3項規則可以不遵從,但若遵從則可提升效能。改寫hashCode()方法規則有3項,第1、2項一定要遵從,第3項規則可以不遵從,但若遵從則可提升效能。 • 同一個執行階段,相同物件呼叫hashCode()方法所得的值一定相同。 • 如果2個物件equals()方法比對後得到true,則呼叫hashCode()方法所得的值也必須相同。 • 如果2個物件使用equals()方法比對後得到false的結果,則呼叫hashCode()方法所得的值最好不同,這樣有助於提升執行效能。
輸出結果 書籍資訊如下: -------------------- Java程式設計 580.0 -------------------- SCJP認證手冊 600.0 -------------------- • 範例說明 • 第9行:改寫equals()方法。 • 第10行:如果成立就代表相同實體,其值必定相同。 • 第12行:要比較的物件為null或不屬於Book類別,直接回傳false。 • 第14行:要比較屬性值,就需要將obj物件轉成Book物件,方能比較。 • 第18行:改寫Object類別的hashCode()方法。
SortedSet集合 SortedSet集合有2個特色,而TreeSet是SortedSet集合的子類別,所以有相同特色: 1. 元素值不重複。 2. 元素有排序性。
Comparable介面 要讓物件加入至SortedSet集合內之後有排序性,該物件所屬類別必須實作Comparable介面的compareTo()方法。假設SortedSet集合內已有1個物件o1,並準備新增另一個物件o2, 會自動執行「o1.compareTo(o2);」,有3種回傳值: 1. 正整數:代表「o1 > o2」,則o2會排在o1之前。 2. 負整數:代表「o1 < o2」,則o1會排在o2之前。 3. 零:代表「o1 = o2」,因為元素值不重複,o2無法成功加入。
輸出結果 書籍資訊如下: -------------------- VB2008程式設計 450.0 -------------------- Java程式設計 580.0 -------------------- SCJP認證手冊 600.0 -------------------- • 範例說明 • 第9行:實作Comparable介面的compareTo()方法。 • 第10行:將price屬性設定成排序的依據。
子集檢視 TreeSet實作NavigableSet介面,所以具有子集檢視(SubSet)的功能。所謂子集檢視,就是以TreeSet集合建立1個局部映射的子集合。當原集合內容更動時,子集合內容也會一併更動。
輸出結果 [1, 3, 5, 7, 9] [1, 3] [1, 2, 3, 5, 7, 9] [1, 2, 3] • 範例說明 • 第8行:設定ts集合的子集檢視,限定元素值在1(含)~ 3(含)之間。 • 第10行:ts增加的元素在子集檢視範圍內,所以在子集檢視中可以看到該元素。 • 第12行:subSet欲增加4,超過當初限定的範圍,會產生執行錯誤。
List集合 • List集合可使用索引來存取元素,有2個特色,而ArrayList、LinkedList都是List集合的子類別,所以有相同特色: • 1. 元素有順序性。 • 使用索引。 • 元素值可重複
輸出結果 SCWCD認證手冊 SCJP認證手冊 VB2008程式設計 • 範例說明 • 第7行:將物件插入索引為2的位置上。 • 第8行:用"SCWCD認證手冊"取代索引為0的元素。
Queue集合 • Queue(佇列)集合元素存取的方式是先進先出(FIFO)。一般建議使用專屬的offer()和poll()方法,以避免產生不必要的例外事件,而造成元素存取中斷。PriorityQueue和LinkedList是其子類別: • PriorityQueue:元素會先做升冪排序。 • LinkedList:元素加入的順序決定了存取的順序。
輸出結果 PriorityQueue: CCNA LPIC SCJP -------------------- LinkedList: LPIC SCJP CCNA • 範例說明 • 第5~7行:將加入元素升冪排序。 • 第10行:取得第一順位的元素值,但不會移除該元素。 • 第11行:取得第一順位的元素值,並同時移除該元素。
12-5 Map的功能與架構 Map的「鍵」(Key)如同索引的功能,不過最大特色就是可以自訂其值。Map一次放2個物件,1個是鍵,另1個則是對應的「值」(Value),這2個物件合起來就稱作「鍵值組」(Key-Value Pair)。
HashMap HashMap是Map的子類別,其特色如下: 1. 鍵不重複。 2. 鍵無順序性。
範例說明 • 第6、8行:"Java"鍵會對應到新值450。 • 第15行:將鍵轉存成Set集合。 • 第17行:將值轉存成Collection集合。 輸出結果 map:{SCJP=600, CCNA=600, Java=450} map:{SCJP=600, Java=450} keys:[SCJP, Java] values:[600, 450] map是否被清空?true
SortedMap TreeMap是SortedMap的子類別,其特色如下: 1. 鍵不重複。 2. 鍵無排序性。
輸出結果 map:{CCNA=600, Java=450, SCJP=600} map:{SCJP=600, Java=450} keys:[SCJP, Java] values:[600, 450] map是否被清空?true • 範例說明 • 第9行:TreeMap鍵的類型不可不同。 • 第10行:鍵不可以為null。