返回列表 發帖

集合 (一) - ArrayList

本帖最後由 李泳霖 於 2023-4-29 13:20 編輯

Collection 可以翻譯為集合,是將多個元素組織為一個單元的抽象設計方式。

Collection 有時也被稱為集合物件或容器,指一群相關聯的資料集合在一起組成一個物件。而集合物件裡的資料,稱為元素。我們可以運用集合物件儲存、取用或操作資料(新增、刪除、排序等),或將資料從一個方法傳遞到另一個方法。

至於要使用什麼樣的容器則依設計需求而定,可以使用循序有索引的 List 結構、不允許重複元素的 Set 結構、或是「鍵-值」(Key-Value)索引的 Map 結構來儲存資料。

Java Collections Framework 主要分為兩大繼承族譜,一類為 Collection 介面的子孫介面,另一類為 Map 介面的子孫介面。其中,Collection 介面一系代表的是單一元素系,而 Map 介面一系代表的是 Key-Value 的成對(pair)元素系。



(一) 幾個主要介面的特性

- Collection 介面
可以將此介面視為單一元素的集合,並未規定元素在集合內是否允許重複,也未規定是否具有順序,進階的規定交由繼承的子介面來規範。

-Set 介面
其內不能有重複的元素,但元素的順序未加以規定,類似於數學上的集合。

-SortedSet 介面
繼承自 Set 介面,並且要求其內的元素會自動遞增排序,譬如英漢字典裡的單字排序就符合此介面的規範。

-List 介面
其內可以有重複的元素,且元素在集合裡是有順序性的(物件加入容器的順序),每個元素都有其對應的位置(數值的索引),可以透過位置來存取元素,譬如陣列(Array)就符合此介面的規範。

-Queue 介面
其內元素的取出具有一定的順序,即符合先進先出(first-in first-out)的原則。

-Map 介面
此介面為成對(pair)之集合,每個元素由兩個值組成,一個為 key另一個為 value。此外,key值是不能重複的,且每個 key只能映射(mapping)到一個 value,但每個 value則不限定幾個 key來對應。每個元素必須同時有 key與 value,成對表現才具意義。

-SortedMap 介面
繼承自 Map 介面,規定其內的元素必須按照 key 值自動排序。譬如成績單若依學號來排序,即符合此介面的規範。

(二) 幾個常見的集合介面實作

-HashSet 類別(Set 介面的實作)
HashSet 在實作時,採用資料結構中雜湊表(Hash Table)的方式來完成,元素的順序與存入時的順序無關。HashSet 根據湊雜碼來確定元素於容器中儲存的位置,也根據雜湊碼來快速的找到容器中的元素,在大多數情況下這樣的方式可以有效提升搜尋、新增、刪除元素的速度。

-TreeSet 類別(SortedSet 的實作)
TreeSet 使用的是紅黑樹(Red-black tree)的資料結構來實作。每次有資料加進去,就會對資料作排序(遞增)。

-ArrayList 類別(List 介面的實作)
ArrayList 使用陣列結構來實作,元素加入時是用索引值(index)依序儲存。陣列的特性是依據索引來快速指定物件的位置,所以對於快速的隨機取得物件來說,使用 ArrayList 可以得到較好的效能,但由於使用陣列實作,若要從中間作移除或插入物件的動作,會需要搬動後段的陣列元素以重新調整索引順序,所以速度上就會慢的多。

-LinkedList 類別(List 介面與 Deque 介面的實作)
LinkedList 使用鏈結串列(Linked list)的資料結構來實作。鏈結串列是由許多節點(node)所構成的串列(list),每個節點包含資料欄位與鏈結欄位,透過鏈結欄位指向下一個節點的位址,至於最後一個節點的鏈結欄位則指向 null,代表串列已經結束。



鏈結串列在刪除或插入節點時,是透過改變鏈結欄位的方式達成,不必如同陣列般進行資料的大量搬移,因此如果元素在加入之後大都是為了取出,而不會常作移除或插入的動作,建議使用 ArrayList 效能上會比較好;但如果需要經常從容器中作移除或插入元素的動作,則使用 LinkedList 會獲得較好的效能。

-HashMap 類別(Map 介面的實作)
HashMap 使用雜湊表結構來實作,儲存的元素分為 key 值與 value 值,形成一個 key-value pair,使我們能依據 key 值快速查找到對應的資料。

-TreeMap 類別(SortedMap 介面的實作)
TreeMap 使用紅黑樹結構來實作,儲存的元素同樣分為 key 值與 value 值,元素會依據 key 值由小至大排序。

(三) Iterator 與ListIterator 介面

Iterator 與 ListIterator 介面,可用來「走訪」或是刪除集合物件的元素。Iterator 物件的讀取是單向的,且只能讀取一次;而 ListIterator 物件的走訪可以是雙向的(正向、反向)。

(四) Collections 類別

Collections 類別是 Java Collections Framework 中專門負責演算法的類別。該類別中提供了多個有用的 static 方法,較常用的有 binarySearch()、copy()、max()、min()、reverse()、sort()、swap() 等。

範例一:ArrayList

  1. import java.util.ArrayList;


  2. public class Ch01 {

  3.         public static void main(String[] args) {
  4.                 ArrayList<Integer> al=new ArrayList<Integer>();
  5.                 al.add(80);
  6.                 al.add(100);
  7.                 for(int i=10;i>=2;i-=2)
  8.                         al.add(i);
  9.                 al.add(40);
  10.                 al.add(60);
  11.                 System.out.println("元素個數:"+al.size());
  12.                 System.out.println("集和內容"+al);
  13.                 al.add(1,150);
  14.                 System.out.println("集和內容"+al);
  15.                 al.set(2,10);
  16.                 System.out.println("集和內容"+al);
  17.                 al.remove(1);
  18.                 System.out.println("第一個元素質為10的編號:"+al.indexOf(10));
  19.                 System.out.println("最後一個元素質為10的編號:"+al.lastIndexOf(10));
  20.                 System.out.println("集合中編號為3的值:"+al.get(3));

  21.         }

  22. }
複製代碼
istak.teach2@gmail.com

此帖僅作者可見
istak.teach2@gmail.com

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

返回列表