Board logo

標題: 集合 (一) - ArrayList [打印本頁]

作者: 葉桔良    時間: 2022-9-24 12:54     標題: 集合 (一) - ArrayList

本帖最後由 葉桔良 於 2023-5-12 19:18 編輯

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. import java.util.Collections;
  3. public class test {
  4.         public static void main(String[] args) {
  5.                 ArrayList<Integer> n=new ArrayList<Integer>();  //可將 ArrayList 集合視為可改變大小的動態陣列
  6.                 for(int i=10;i>=2;i-=2)
  7.                     n.add(i);
  8.                 n.add(40);
  9.             n.add(60);       //以上所加入的元素將依據加入的順序排列
  10.             n.add(0, 80);    //指定索引值為 0 加入元素
  11.             n.add(1, 100);
  12.             System.out.println("元素個數:"+n.size());
  13.             System.out.println("集合內容:"+n);
  14.             n.add(1, 150);   //插入點後的所有元素其索引值都會改變
  15.             System.out.println("集合內容:"+n);
  16.             n.set(2, 10);    //將索引值 2 的元素以 10 取代
  17.             System.out.println("集合內容:"+n);
  18.             //n.remove(1);    //移除索引值為 1 的元素
  19.             n.remove(n.indexOf(150));   //移除值為 150  的元素 (索引值為 1)
  20.             System.out.println("集合內容:"+n);
  21.             System.out.println("第一個元素值為10的索引值:"+n.indexOf(10));       //由前往後搜尋
  22.             System.out.println("最後一個元素值為10的索引值:"+n.lastIndexOf(10));  //由後往前搜尋
  23.             System.out.println("集合中索引值為3的元素:"+n.get(3));
  24.             System.out.println("最大的元素值為:"+Collections.max(n));
  25.             System.out.println("最小的元素值為:"+Collections.min(n));
  26.             Collections.sort(n);
  27.             System.out.print("遞增排序:");
  28.             for(int i:n)
  29.                 System.out.print(i+" ");
  30.             System.out.println();
  31.             System.out.print("遞減排序:");
  32.             for(int i=n.size()-1; i>=0; i--)
  33.                 System.out.print(n.get(i)+" ");
  34.             System.out.println();            //集合中索引值為 3 的元素
  35.         }
  36. }
複製代碼

作者: 朱春男    時間: 2022-9-24 14:38

此帖僅作者可見
作者: 朱春珠    時間: 2022-9-24 14:49

此帖僅作者可見
作者: 李泳霖    時間: 2022-10-2 09:29

此帖僅作者可見
作者: 東緯    時間: 2022-11-6 11:07

此帖僅作者可見
作者: 盧禹廷    時間: 2023-2-17 21:16

此帖僅作者可見




歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://seed.istak.org.tw/) Powered by Discuz! 7.2