1 / 34

第 12 章 集合與泛型

第 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. 範例說明

Download Presentation

第 12 章 集合與泛型

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第12章 集合與泛型 12-1 集合與陣列的比較 12-2 Collection介面與Collections類別 12-3 泛型 12-4 各種集合的特色 12-5 Map的功能與架構

  2. 12-1 集合與陣列的比較

  3. 12-2 Collection介面與Collections類別 java.util.Collection介面是整個集合架構的根介面。

  4. 輸出結果 元素總數:3 集合內容:1 true Java 移除1個元素之後... 集合內容:1 Java 集合是否被清空?true • 範例說明 • 第5~7行:將物件一一加入集合內,而基本類型都會先AutoBoxing成對應的物件型後才加入。 • 第8行:取得元素總數。 • 第10行:取出時的類型是Object。 • 第13行:移除「true」元素。 • 第16~20行:取得Iterator物件後,可透過該物件走訪所有集合的元素。 • 第21行:清空集合內容物。 • 第22行:檢查集合是不是空的容器。

  5. Collections類別 java.util.Collections類別提供許多與集合相關的static方法,例如排序與搜尋。 • 注意 • 執行排序時:(1)元素資料類型必須一致(2)元素不可為null值。 • 執行搜尋時:必須先排序。

  6. 輸出結果 元素升冪排序後:[AA, Aa, a, aa] 「aa」的索引:3 元素反轉後:[aa, a, Aa, AA] • 範例說明 • 第9行:Collections只能幫List集合排序。 • 第12行:排序完畢後方能呼叫binarySearch()方法。搜尋到"aa"值後回傳所在索引。 • 第14行:reverse()方法會將元素順序反轉。

  7. 12-3 泛型 1個屬性往往不止於1種資料類型,例如之前的Book類別,其price屬性就有可能是整數、小數或是文字類型;這樣一來,程式會變成複雜難懂。要解決這種問題,泛型(Generics)是最佳選擇。

  8. 輸出結果 書籍定價為:580 書籍定價為:五百八十 書籍定價為:580.0 • 範例說明 • 第2行:price屬性設為T類型。 • 第12行:將T指定為Integer類型。 • 第21~23行:如果宣告時不指定T的類型,那就是什麼類型都接受,所以會取得Object類型的值。

  9. 注意 前範例第21行沒有指定T的類型,編譯會跳出警示訊息:

  10. 泛型的進階設定 泛型的設定也可以使用「?」搭配「extends」或「super」來增加設定上的彈性。

  11. 輸出結果 書籍定價為:580 • 範例說明 • 第3行:T的類型可以是Number或其子類別。 • 第10行:指定T的類型是Integer。 • 第12行:book物件其泛型T的設定是Integer,符合第3行規定,所以可以呼叫第3行的show()方法。

  12. 泛型應用在集合上 集合搭配泛型就可限制元素的資料類型;而且元素取出後也會與當初限制的資料類型相同。

  13. 輸出結果 總和 = 6 • 範例說明 • 第12、16行:限制元素為Integer類型,第16行不可加入String物件。 • 第17行:集合c的泛型設定是Integer,符合第3行規定。 • 第5行:集合c的元素是Integer物件,取出之後可以直接指派給i。 • 第6行:i會先AutoUnboxing,然後與sum相加。

  14. 12-4 各種集合的特色 Set集合 Set集合有2個特色,而HashSet是Set集合的子類別,所以有相同特色: 1. 元素值不重複。 2. 元素無順序性。

  15. 輸出結果 是否新增成功?false [SCWCD, SCJP] • 範例說明 • 第7行:第5行已加入了"SCJP",所以無法再加入一次。

  16. equals()、hashCode()方法的改寫 • Object類別定義了equals()方法,子類別需改寫此方法以判斷2個物件是否值相同;如果不改寫則一律回傳false。equals()方法屬於精準比對,所以執行效能較差;為了提升比對速度,還要改寫Object類別的hashCode()方法。 • Set集合要新增元素時,會自動執行下列步驟: • 呼叫hashCode():得到的整數值不同,直接認定 • 這2個物件值不同,而不再呼叫equals()來比對。 • 呼叫equals():如果得到false,代表值不同。

  17. 改寫hashCode()方法規則有3項,第1、2項一定要遵從,第3項規則可以不遵從,但若遵從則可提升效能。改寫hashCode()方法規則有3項,第1、2項一定要遵從,第3項規則可以不遵從,但若遵從則可提升效能。 • 同一個執行階段,相同物件呼叫hashCode()方法所得的值一定相同。 • 如果2個物件equals()方法比對後得到true,則呼叫hashCode()方法所得的值也必須相同。 • 如果2個物件使用equals()方法比對後得到false的結果,則呼叫hashCode()方法所得的值最好不同,這樣有助於提升執行效能。

  18. 接續…

  19. 輸出結果 書籍資訊如下: -------------------- Java程式設計 580.0 -------------------- SCJP認證手冊 600.0 -------------------- • 範例說明 • 第9行:改寫equals()方法。 • 第10行:如果成立就代表相同實體,其值必定相同。 • 第12行:要比較的物件為null或不屬於Book類別,直接回傳false。 • 第14行:要比較屬性值,就需要將obj物件轉成Book物件,方能比較。 • 第18行:改寫Object類別的hashCode()方法。

  20. SortedSet集合 SortedSet集合有2個特色,而TreeSet是SortedSet集合的子類別,所以有相同特色: 1. 元素值不重複。 2. 元素有排序性。

  21. 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無法成功加入。

  22. 接續…

  23. 輸出結果 書籍資訊如下: -------------------- VB2008程式設計 450.0 -------------------- Java程式設計 580.0 -------------------- SCJP認證手冊 600.0 -------------------- • 範例說明 • 第9行:實作Comparable介面的compareTo()方法。 • 第10行:將price屬性設定成排序的依據。

  24. 子集檢視 TreeSet實作NavigableSet介面,所以具有子集檢視(SubSet)的功能。所謂子集檢視,就是以TreeSet集合建立1個局部映射的子集合。當原集合內容更動時,子集合內容也會一併更動。

  25. 輸出結果 [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,超過當初限定的範圍,會產生執行錯誤。

  26. List集合 • List集合可使用索引來存取元素,有2個特色,而ArrayList、LinkedList都是List集合的子類別,所以有相同特色: • 1. 元素有順序性。 • 使用索引。 • 元素值可重複

  27. 輸出結果 SCWCD認證手冊 SCJP認證手冊 VB2008程式設計 • 範例說明 • 第7行:將物件插入索引為2的位置上。 • 第8行:用"SCWCD認證手冊"取代索引為0的元素。

  28. Queue集合 • Queue(佇列)集合元素存取的方式是先進先出(FIFO)。一般建議使用專屬的offer()和poll()方法,以避免產生不必要的例外事件,而造成元素存取中斷。PriorityQueue和LinkedList是其子類別: • PriorityQueue:元素會先做升冪排序。 • LinkedList:元素加入的順序決定了存取的順序。

  29. 輸出結果 PriorityQueue: CCNA LPIC SCJP -------------------- LinkedList: LPIC SCJP CCNA • 範例說明 • 第5~7行:將加入元素升冪排序。 • 第10行:取得第一順位的元素值,但不會移除該元素。 • 第11行:取得第一順位的元素值,並同時移除該元素。

  30. 12-5 Map的功能與架構 Map的「鍵」(Key)如同索引的功能,不過最大特色就是可以自訂其值。Map一次放2個物件,1個是鍵,另1個則是對應的「值」(Value),這2個物件合起來就稱作「鍵值組」(Key-Value Pair)。

  31. HashMap HashMap是Map的子類別,其特色如下: 1. 鍵不重複。 2. 鍵無順序性。

  32. 範例說明 • 第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

  33. SortedMap TreeMap是SortedMap的子類別,其特色如下: 1. 鍵不重複。 2. 鍵無排序性。

  34. 輸出結果 map:{CCNA=600, Java=450, SCJP=600} map:{SCJP=600, Java=450} keys:[SCJP, Java] values:[600, 450] map是否被清空?true • 範例說明 • 第9行:TreeMap鍵的類型不可不同。 • 第10行:鍵不可以為null。

More Related