550 likes | 705 Views
第 17 章 Java 的集合物件. 17-1 集合物件的基礎 17-2 實作 Set 介面的集合類別 17-3 實作 List 介面的集合類別 17-4 實作 Map 介面的集合類別 17-5 輸出集合物件的元素. 17-1 集合物件的基礎. 17-1-1 Java Collections Framework 17-1-2 集合介面 17-1-3 泛型 Java 的集合物件. 17-1-1 Java Collections Framework- 說明.
E N D
第17章 Java的集合物件 • 17-1 集合物件的基礎 • 17-2 實作Set介面的集合類別 • 17-3 實作List介面的集合類別 • 17-4 實作Map介面的集合類別 • 17-5 輸出集合物件的元素
17-1 集合物件的基礎 • 17-1-1 Java Collections Framework • 17-1-2 集合介面 • 17-1-3 泛型Java的集合物件
17-1-1 Java Collections Framework-說明 • 「集合物件」(Collections)是指一組相關的物件集合,將這組物件集合視為單一物件,在集合物件中的物件稱為「元素」(Elements),集合物件有很多種,其儲存的元素可能允許重複,有些集合物件的元素會進行排序,在舊版Java技術是指Vector和Hashtable物件。
17-1-1 Java Collections Framework-架構1 • JDK 1.2之後的版本提供全新的集合物件架構,稱為Java Collections Framework,這是用來儲存和處理集合物件的統一軟體架構,其組成如下所示: • 集合介面(Collection Interface):一組定義完善的Java介面,提供處理集合物件的標準介面,其目的是讓集合物件擁有一致的操作方式,包含:Collection、Set、SortedSet、List、Map和SortedMap介面。
17-1-1 Java Collections Framework-架構2 • 實作(Implementations):實作集合介面的類別,稱為「具體類別」(Concrete Class),對比抽象類別,這是可以使用new運算子建立實例的類別,以實作的集合介面來區分,常用的介面如下表所示:
17-1-1 Java Collections Framework-架構3 • 演算法(Algorithms):當物件實作集合介面,其實作的一些多形方法,可以執行集合物件元素的搜尋與排序等演算法。
17-1-2 集合介面-說明 • 集合介面(Collection Interface)是用來處理集合物件中儲存的物件,提供一致的物件操作方式來新增、刪除和搜尋元素的方法,這是一個介面型態的類別架構,其根介面是:Collection和Map介面。
17-1-2 集合介面-Collection集合介面(圖例) • Collection介面的擁有Set和List子介面,Set介面擁有SortedSet子介面,介面的繼承架構,如右圖所示:
17-1-2 集合介面-Collection集合介面(介面說明) • Collection介面:類別架構的根介面,不過並沒有任何類別直接實作Collection介面,Java Collections Framework的具體類別(Concrete Class)都是實作其子介面。 • Set介面:實作Set介面的集合物件,其儲存元素沒有重複元素。 • List介面:實作List介面的集合物件可以擁有重複元素,元素是以循序方式存入,可以使用類似陣列索引方式來存取元素。 • SortedSet介面:Set介面的子介面,實作SortedSet介面的集合物件,其儲存元素不只沒有重複,而且是從小到大進行排序。
17-1-2 集合介面-Map集合介面(圖例) • Map介面並不是Collection介面的子介面,Map介面是一種特殊的Set介面,儲存的資料是一組對應元素,擁有子介面SortedMap,介面繼承架構,如右圖所示:
17-1-2 集合介面-Map集合介面(介面說明) • Map介面:實作Map介面的集合物件並沒有重複元素,儲存的元素是一對:鍵值(Key)和值(Value),這是一種單方向的對應,鍵值可以對應其值,例如:網域名稱對應IP位址。 • SortedMap介面:對應SortedSet介面的Map介面子介面,實作SortedMap介面的集合物件,其儲存元素沒有重複,而且是以鍵值由小到大進行排序。
17-1-3 泛型Java的集合物件-說明 • 「泛型Java」(Generic Java)是JDK 5.0版在Java語法上的重大變革,提供類似C++語言的「樣版」(Templates)語法,新增編譯階段的集合物件型態檢查功能,可以減少程式碼中取出元素所需的大量型態轉換。
17-1-3 泛型Java的集合物件-泛型型態 • 泛型Java可以使用「泛型型態」(Generic Types)來擴充Java語言,簡單的說,就是在建立集合物件時,以泛型型態指定集合物件儲存元素的資料型態,如下所示: HashSet<Byte> hset = new HashSet<Byte>(); HashSet<Float> hset = new HashSet<Float>(); HashSet<String> hset = new HashSet<String>(); • 使用”<”和”>”括起資料型態就是泛型型態,它是用來指定集合物件儲存元素的資料型態。
17-2 實作Set介面的集合類別 • 17-2-1 Set介面的基礎 • 17-2-2 HashSet類別 • 17-2-3 TreeSet類別
17-2 實作Set介面的集合類別 • Set介面是Collection介面的子介面,實作Set介面的集合物件,其儲存元素並沒有重複,如果是實作子介面SortedSet的集合物件,儲存的就是排序元素。
17-2-1 Set介面的基礎-說明 • Set介面繼承Collection介面的所有方法,只是規範建構子和某些方法,以滿足其儲存元素不能重複。
17-2-2 HashSet類別-說明 • HashSet類別實作Set介面,繼承Collection介面的方法,使用「雜湊表」(Hash Table)演算法來改進新增、刪除和存取集合物件元素的執行效率,其儲存元素的排列和插入順序不同,也不保證擁有固定的排列順序。
17-2-2 HashSet類別-建立物件 • HashSet類別提供數種過載建構子,在Java程式建立HashSet物件,如下所示: HashSet<String> hset = new HashSet<String>(); • 上述程式碼建立儲存字串元素的HashSet物件,泛型型態為String。
17-2-2 HashSet類別-建構子 • 過載建構子的說明,如下表所示:
17-2-3 TreeSet類別-說明 • TreeSet類別實作SortedSet介面,這是Set介面的子介面,其儲存元素不只沒有重複,而且由小到大進行排序,這是一種「排序集合物件」(Sorted Collection)。
17-2-3 TreeSet類別-建立物件 • TreeSet類別提供數種過載建構子,在Java程式建立TreeSet物件,如下所示: TreeSet<String> tset = new TreeSet<String>(); • 上述程式碼建立儲存字串元素的TreeSet物件。
17-2-3 TreeSet類別-建構子 • 過載建構子的說明,如下表所示:
17-2-3 TreeSet類別-介面方法 • TreeSet類別實作SortedSet介面,除了繼承Set介面的方法外,其新增的介面方法,如下表所示:
17-3 實作List介面的集合類別 • 17-3-1 List介面的基礎 • 17-3-2 ArrayList類別 • 17-3-3 LinkedList類別
17-3-1 List介面的基礎-說明 • List介面也是繼承自Collection介面,實作此介面的集合類別是一種「循序集合物件」(Ordered Collection),允許儲存重複元素,而且元素擁有索引位置,可以使用類似陣列索引方式來存取元素。 • 「循序集合物件」(Ordered Collection)和「排序集合物件」(Sorted Collection)並不相同,循序集合物件如同陣列是以元素位置的索引來排列;排序集合物件是以元素值的大小進行排序。
17-3-2 ArrayList類別-說明 • ArrayList類別實作List介面,儲存元素的方式類似陣列,元素使用索引位置依序存入,只需將元素新增或插入ArrayList物件,並不用事先宣告物件的尺寸,如同一個可調整陣列尺寸的動態陣列。
17-3-2 ArrayList類別-建立物件 • 在Java程式建立ArrayList物件,如下所示: ArrayList<String> alist = new ArrayList<String>(); • 上述程式碼使用建構子建立ArrayList物件儲存字串元素,泛型型態是String。
17-3-2 ArrayList類別-建構子 • 過載建構子的說明,如下表所示:
17-3-2 ArrayList類別-介面方法 • ArrayList物件除了實作List介面的方法外,還新增一些方法,其說明如下表所示:
17-3-2 ArrayList類別-範例 • 在新增ArrayList物件的元素後,Java程式可以使用for迴圈配合索引取得每一個物件元素,如下所示: for ( int i = 0; i < alist.size(); i++ ) System.out.print(alist.get(i)+" "); • 程式碼使用size()方法取得元素數,get()方法配合索引位置取出ArrayList物件的元素。
17-3-3 LinkedList類別-說明 • LinkedList類別是實作List介面,這是類似「鏈結串列」(Linked Lists)資料結構的類別,各節點如同火車掛車廂一般,將每一個車廂的節點連接起來,如下圖所示:
17-3-3 LinkedList類別-建構子 • LinkedList類別提供方法可以在串列的頭和尾取出和刪除元素,在Java程式只需使用建構子就可建立LinkedList物件,過載建構子的說明,如下表所示:
17-3-3 LinkedList類別-方法 • LinkedList物件除了實作List介面的方法外,新增方法的說明,如下表所示:
17-4 實作Map介面的集合類別 • 17-4-1 Map介面的基礎 • 17-4-2 HashMap類別 • 17-4-3 TreeMap類別
17-4-1 Map介面的基礎-說明 • Map介面是類別架構的根介面,擁有子介面SortedMap介面,實作Map介面的集合類別,其儲存物件共有2個:鍵值(Key)和對應值(Value)的物件,其中鍵值不可重複,一個鍵值對應一個值。
17-4-2 HashMap類別-說明 • HashMap類別實作Map介面,相當於是舊版的Hashtable類別,其儲存元素有2個:key鍵值和其對應值,允許儲存null值。 • HashMap類別提供數種過載的建構子,在Java程式建立HashMap物件,如下所示: HashMap<String,String> hmap = new HashMap<String,String>(); • 程式碼建立HashMap物件,因為儲存元素有鍵值和對應值,所以指定2個泛型型態。
17-4-2 HashMap類別-建構子 • 過載建構子的說明,如下表所示:
17-4-3 TreeMap類別-說明 • TreeMap類別實作SortedMap介面,SortedMap介面是Map介面的子介面,實作此介面的集合物件是以鍵值由小到大進行排序。 • 在Java程式建立String資料型態的TreeMap物件,如下所示: TreeMap<String,String> tmap = new TreeMap<String,String>();
17-4-3 TreeMap類別-建構子 • 過載建構子的說明,如下表所示:
17-4-3 TreeMap類別-介面方法 • TreeMap類別實作SortedMap介面,除了繼承Map介面的方法外,其新增的介面方法,如下表所示:
17-5 輸出集合物件的元素 • 17-5-1 Iterator介面輸出元素 • 17-5-2 ListIterator介面輸出元素
17-5-1 Iterator介面輸出元素-說明 • Iterator介面改進舊版Java技術的Enumeration介面,提供一致方法來走訪集合物件的元素或刪除元素,因為Collections集合物件已經實作Iterator介面,換句話說,只需使用Collection、Set和List介面的iterator()方法,就可以取得Iterator<E>介面的物件,如下表所示:
17-5-1 Iterator介面輸出元素-範例 • 例如:HashSet<String>物件hset可以使用上表方法取得Iterator介面物件,如下所示: Iterator<String> iterator = hset.iterator(); • 上述程式碼是將HashSet物件的元素轉換成Iterator<E>介面物件,泛型型態為String,現在我們只需呼叫介面方法,就可以依序走訪和刪除元素。
17-5-1 Iterator介面輸出元素-介面方法 • 在取得Iterator<E>介面物件後,即可配合while迴圈走訪集合物件的元素,如下所示: while (iterator.hasNext()) System.out.print(" "+iterator.next()); • 上述程式碼使用hasNext()方法檢查是否有下一個元素,如果有,使用next()方法取得此元素。
17-5-2 ListIterator介面輸出元素-說明 • 實作List介面的集合物件除了可以使用Iterator介面外,還可以使用ListIterator介面,這是Iterator介面的子介面,除了可以使用一致的走訪方法外,還可以雙向走訪集合物件的元素,即從頭到尾,或是從尾到頭的走訪。
17-5-2 ListIterator介面輸出元素-取得介面物件 • List介面物件listIterator()方法,可以取得ListIterator<E>介面物件,如下表所示:
17-5-2 ListIterator介面輸出元素-範例 • 例如:ArrayList<String>物件alist可以使用上表方法取得ListIterator介面物件,如下所示: ListIterator<String> iterator = alist.listIterator(0); • 上述程式碼是將ArrayList物件的元素轉換成ListIterator<E>介面物件,泛型型態為String,然後就可以使用介面方法雙向走訪、新增、取代和刪除元素。