Board logo

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

作者: 李泳霖    時間: 2023-4-21 17:48     標題: 集合 (一) - 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. }
複製代碼

作者: 李泳霖    時間: 2023-4-21 17:48

此帖僅作者可見
作者: 呂宏晏    時間: 2023-4-22 17:26

此帖僅作者可見
作者: 秉宏1    時間: 2023-4-22 17:26

此帖僅作者可見
作者: 張博翔    時間: 2023-4-22 17:29

此帖僅作者可見
作者: 陳佑俊    時間: 2023-4-22 17:29

此帖僅作者可見
作者: 歐睿仁    時間: 2023-4-22 17:29

此帖僅作者可見
作者: 陳駿彥    時間: 2023-4-22 17:29

此帖僅作者可見
作者: 王宥凱    時間: 2023-4-22 17:29

此帖僅作者可見
作者: 許晏睿    時間: 2023-4-22 17:29

此帖僅作者可見
作者: 黃昱齊    時間: 2023-4-22 17:29

此帖僅作者可見
作者: 夏子甯    時間: 2023-4-22 17:30

此帖僅作者可見
作者: 周桓宇    時間: 2023-4-22 17:30

此帖僅作者可見
作者: 江家同    時間: 2023-4-22 17:31

此帖僅作者可見
作者: 蔡秉勛    時間: 2023-4-22 17:34

此帖僅作者可見
作者: 王競儀    時間: 2023-4-29 13:17

此帖僅作者可見
作者: 上官語恬    時間: 2023-4-29 15:30

此帖僅作者可見
作者: 秉宏1    時間: 2023-4-29 16:19

此帖僅作者可見
作者: 許晏睿    時間: 2023-4-29 16:19

此帖僅作者可見
作者: 張博翔    時間: 2023-4-29 16:19

此帖僅作者可見
作者: 歐睿仁    時間: 2023-4-29 16:20

此帖僅作者可見
作者: 陳駿彥    時間: 2023-4-29 16:20

此帖僅作者可見
作者: 王競儀    時間: 2023-4-29 16:21

此帖僅作者可見
作者: 鄞美旭    時間: 2023-4-29 16:21

此帖僅作者可見
作者: 周桓宇    時間: 2023-4-29 16:21

此帖僅作者可見
作者: 鄞美旭    時間: 2023-4-29 16:22

此帖僅作者可見
作者: 富溢    時間: 2023-4-29 16:22

此帖僅作者可見
作者: 王宥凱    時間: 2023-4-29 16:22

此帖僅作者可見
作者: 江家同    時間: 2023-4-29 16:27

此帖僅作者可見
作者: 富溢    時間: 2023-4-29 16:57

此帖僅作者可見
作者: 陳佑俊    時間: 2023-5-6 12:09

此帖僅作者可見




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