• 沒有找到結果。

13Java集合架構、泛型與實用API.pdf

N/A
N/A
Protected

Academic year: 2021

Share "13Java集合架構、泛型與實用API.pdf"

Copied!
37
0
0

加載中.... (立即查看全文)

全文

(1)Java 集合架構、泛型 與實用 API 王元俊 Wang Yuan-Jiun [email protected] 1.

(2) 學習目標 • • • •. 集合 (Collection) 的概念 什麼是泛型 (Generics) Collection 介面 Map 介面. 2.

(3) 3.

(4) 4.

(5) 集合 (Collection) (1) • 集合用來描述與存放一群物件。集合中的物件稱 之為元素 (Element)。 • 集合的四個特性  排序性 (Sorted):集合元素依照某種順序排序。  順序性 (Ordered):資料具有特定的順序擺放 與取出。  重複性 (Duplicates):是否允許存放重複物件 在集合中。  鍵值 (Use Key):使用鍵值來參考到真正物件 所存放的位置。每一個在集合元素中所存放 的物件都有相對應的鍵值,鍵值必須唯一, 每一個鍵值最多只能對應一個元素。 5.

(6) 集合 (2) • 操作集合物件的內部元素資料,需要以下三項 技巧:  增加或移除元素。  找出並取出指定元素。  在集合中使用走訪器 (Iterator),也就是能 找到前一個或下一個的功能。. 6.

(7) 泛型 (Generics) (1) • 泛型提出的動機很簡單直接:發明一種機制, 能夠實現通用的標準容器 (Container) 庫。 • 通用的標準容器庫,就是要能夠做到存放所有 可能的類別。 • 泛型讓程式設計能編寫一般化的資料型態,具 有可重複使用的演算法,其效率與針對某特定 資料型態而設計的演算法相同。. 7.

(8) 泛型 (2) • Java 中所有定義的類別,都以 Object 為最上層 的父類別。 • 因此可以設計一個容器類別,例如集合物件, 裡面放置 Object 型別的物件。 • 但是,大多數容器內的資料,其資料型態都是 相同的;而且 Object 型別的物件在使用時,計 算需要經過型別轉換。 • 泛型提供編譯時期容器內的物件資料型態檢查, 以及高效率的計算演算法。. 8.

(9) 泛型語法 泛型類別<資料型別> 變數名稱 = new 泛型類別<資料型別>();. • 宣告與建立物件時,使用角括號告知編譯器, 此物件的資料型別,不需使用小括號轉換型態。 • 使用了宣告泛型的類別而不做資料型別宣告, 會使用 Object,也就是回歸沒有使用泛型前的 做法。 • 範例 ArrayList<String> myAryList = new ArrayList<String>(); // 指定元素為 String 型別 9.

(10) Collection 介面 • Java 集合物件的共同行為定義在 Collection 介 面。 <<interface>> Collection. <<interface>> List. ArrayList LinkedList. <<interface>> Set. <<interface>> Queue. <<interface>> Deque. • 集合物件時依不同的需求實作介面,建立新的 類別。 10.

(11) Collection 介面家族簡介 • List 介面  記錄每個物件的索引順序,並可依索引取 回物件。  List 是類似陣列的集合,每一個集合元素 都有像陣列一樣的索引值,並且可以在加 入集合元素時就給定索引值。 • Set 介面:集合的物件無順序性、元素與元素 之間不得重複,具有集合的行為。 • Queue 介面:物件以佇列方式處理,物件由尾 端加入,從前端取得物件。 • Deque 介面:對 Queue 的兩端進行加入、移除 等操作。. 11.

(12) ArrayList 類別簡介 • ArrayList 類別  集合物件具有索引順序,實作方式之一是 使用陣列;而以陣列實作 List 的就是 ArrayList 類別。  ArrayList 可以自由地擴增容量。  實作時用 add() 與 get() 二個方法來置入與 取出元素物件。. 12.

(13) Array 與 ArrayList 比較 Array. ArrayList. 初始陣列資 依使用者宣告所決 均為 Object 型態 料型別 定 所有元素均為相同 Object 可接受的資 資料型別 資料型別 料型別 一維、二維或多維 維度 只能一維 (dimension) 均可 引用套件 java.util.Arrays java.util.ArrayList 佔用記憶體 較小 較大 空間 明確知道存放的資 需要存放不同的資 料個數,而且資料 料型別元素,而且 使用時機 型別相同。 元素個數不確定。 13.

(14) LinkedList 類別簡介 • LinkedList 類別  具有雙向連結串列 (Doubly-Linked List) 特 性的集合物件。  LinkedList 與 ArrayList 一樣具有索引順序。  在走訪元素的效率上比 ArrayList 差。  但在新增與刪除元素的機制上會比 ArrayList 好。. 14.

(15) ArrayList 類別 (1) • 建立 ArrayList 物件,語法 ArrayList<資料型別> 變數名稱 = new ArrayList<資料型別>();. – 範例: ArrayList myAryList = new ArrayList(); // 未指定元素的型別(建議要指定型別) ArrayList<String> myAryList = new ArrayList<String>(); // 指定元素為 String 型別 ArrayList<String> myAryList = new ArrayList<>(); 15 // 也可以這樣寫.

(16) ArrayList 類別 (2) • 加入元素,用 add() 方法 String s = new String(); myAryList.add(s);. • 取得 ArrayList 容器物件中有的元素個數,用 size() 方法 int theSize = myAryList.size();. • 取得索引值位置的元素,用 get() 方法 String str = myAryList.get(1); // 取得索引值 1 的元素 16.

(17) ArrayList 類別 (3) • 查詢是否有特定元素,用 contains() 方法 boolean isIn = myAryList.contains(s); // 若有 s 字串則回傳 true,否則 false. • 查詢特定元素索引值用 indexOf() 方法 int idx = myAryList.indexOf(s); // 回傳索引值,索引從 0 開始. • 判斷 ArrayList 是否為空的,用 isEmpty() 方法 boolean empty = myAryList.isEmpty(); // 回傳 true 或 false 17.

(18) ArrayList 類別 (4) • 刪除特定元素,用 remove() 方法 myAryList.remove(s);. • 指定索引值位置的元素內容,用 set() 方法 myAryList.set(0, "Zero");. – 注意:插入的索引值必須是已經存在的元素, 否則執行時會產生例外 IndexOutOfBoundsException。. 18.

(19) ArrayList 類別 (5) • 複製 ArrayList 的元素到陣列,用 toArray() 方 法。 String [] array = {}; array = myAryList.toArray(array);. • 清除 ArrayList 中的所有元素,用 clear() 方法。 myAryList.clear();. • 排序,用 Collections.sort() 方法 Collections.sort(myAryList); 19.

(20) 範例:ArrayListExample.java (1). 20.

(21) 範例:ArrayListExample.java (2). 21.

(22) ArrayListExample.java 執行結果. 22.

(23) 練習 1. 寫一個函數完成十進位數字轉換為二、四、 八、十六等四種進位制的數值。  應用堆疊 (Stack) 的概念來存放數字基底轉 換的結果,轉換完成後,再將 Stack 內的資 料一一取出,做為結果顯示。  使用 Array List 物件做為堆疊。  以 18 測試結果如下:. 23.

(24) LinkedList 類別 (1) • LinkedList 類別與 ArrayList 類別都實作 List 介 面,所以 ArrayList 類別具有的方法,在 LinkedList 類別都有實作。 – 也就是 ArrayList 類別有的方法,在 LinkedList 類別也可以用,例如,用 get() 取 得索引值位置的元素等功能。 • LinkedList 類別也實作 Queue 介面,所以還增 加了佇列操作的方法。. 24.

(25) LinkedList 類別 (2) • 操作方法  addFirst()、addLast() 範例:myLinkedList.addFirst("Sunday"); myLinkedList.addLast("Saturday");.  getFirst()、getLast() 範例:String strFirst = myLinkedList.getFirst(); String strLast = myLinkedList.getLast();.  removeFirst()、removeLast() 範例:myLinkedList.removeFirst(); myLinkedList.removeLast(); 25.

(26) LinkedList 範例 • LinkedListExample1.java 類似於 ArrayListExample.java,用 LinkedList 實作。 • LinkedListExample2.java. 26.

(27) LinkedListExample2.java. 27.

(28) Map 介面 • 實作 Map 介面的容器 (Container) 物件,物件 元素都會以 Key-Value 的方式儲存。 – 也就是說,存入每一個物件,都要給定一個 唯一的鍵值 (Key),透過用鍵值去取得相對 應物件的值 (Value)。 <<interface>> Map. AbstractMap HashMap. TreeMap. Dictionary. Hashtable. 28.

(29) Collection 與 Map 的區別 1. 容器內每個儲存的元素個數不同。 2. Collection:每個索引值位置只有一個元素。 3. Map:以 Key-Value 對儲存,Key 類似於索引 值功能,Key 的型別不限於整數。. 29.

(30) Map 介面常見的實作類別 • 常見的實作類別為 HashTable 與 HashMap。  HashMap 類別:除了不同步和允許使用 null 鍵值之外,與 Hashtable 大致相同。  TreeMap 類別:類似 HashMap 類別,但元 素會依鍵值由小至大排序。  Hashtable 類別:此類別是實現同步的,不 允許使用 null 鍵值。. 30.

(31) HashMap 類別 (1) • 建立 HashMap 物件,語法 HashMap<鍵值型別, 物件值的型別> HashMap物件名稱 = new HashMap< > (); HashMap<String, String> myHashMap = new HashMap<>();. • put() 方法:放入物件,必須同時指定 Key 與 Value。 myHashMap.put("Sunday", "星期日");. • get() 方法:指定 Key,取得對應 Key 的 Value。 String str = myHashMap.get("Monday"); // str為 "星期一". 31.

(32) HashMap 類別 (2) • values() 方法:取得一個實作 Collection 的物件, 當中包括所有的 Value 物件。 // 印出 myHashMap 中所有的內容值 for (String s : myHashMap.values()) System.out.print(s + " ");. – 說明:印出內容順序與原先放入順序可能不 相同。如果要依照原先插入順序,則可用 java.util.LinkedHashMap,它是 HashMap 的 子類別,在使用 values() 所傳回的 Collection 物件,其內容順序為放入物件之順序。 32.

(33) HashMap 類別 (3) • 取得 HashMap 容器物件中有的元素個數,用 size() 方法 int numElement = myHashMap.size();. • • • •. containsKey() 方法:傳回是否鍵值有 Key。 containsValue() 方法:傳回是否鍵值有 Value。 remove() 方法:刪除 Key-Value 對 clear() 方法:刪除所有的 Key-Value 對. 33.

(34) 範例:HashMapExample.java. 34.

(35) HashMapExample.java 執行結果. 35.

(36) 實作 Map 物件 • 語法 Map<鍵值型別, 物件值的型別> Map 物件名稱 = new 實作 Map 介面的類別< > ();. • 範例 – 宣告一容器資料結構 Map 之變數 m,其 Key 值型態為字串,Value 值型態為整數。 Map<String, Integer> m = new HashMap<> (); 注意,不要寫成 Map<String, Integer> m = new Map<> ();. 36.

(37) Map 物件操作 – 資料 {''a'', 7}, {''b'', -21}, {''z'', 11} 加入此 Map m。 m.put("a", 7); m.put("b", -21); m.put("z", 11);. – 將此 Map m 中 Key 值為 "b" 之項目移除 m.remove("b");. 37.

(38)

參考文獻

相關文件

第一梯次 第二梯次 第二梯次 第二梯次 第二梯次 第三梯次 第三梯次 第三梯次 第三梯次 2.未來將停辦職類 未來將停辦職類 未來將停辦職類 未來將停辦職類、 、 、 、級別 級別 級別 級別:

收費原則 :CCC Code前6碼相同者歸為1類 登錄10個類別以 內收費 NT$5,000. 超過10個類別每類加收費 NT$1,000(超過部分)

According to the regulations, the employer needs to provide either a mobile or landline phone number at which the employer (or a contact person) can be reached.. If

Affidavit: after extending the employment permit, the same construction project will not be used to apply for introduction or renewal of employment of foreigners. (see

甄選類別 甄選名額 缺額性質 聘期

目次 課程類別 課程主題 時數

八、本職類原分甲、乙、丙三級實施檢定多年,各事業機構常按其等級分別進用或提

以下 Java 程式執行完後,輸出結果為何?(A)無法編譯,因為 Rectangle 類別不能同時 extends 一個類別且 implemets 一個介面(B)無法編譯,因為 Shapes 類別沒有