標題:
集合 (一) - 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
import java.util.ArrayList;
import java.util.Collections;
public class test {
public static void main(String[] args) {
ArrayList<Integer> n=new ArrayList<Integer>(); //可將 ArrayList 集合視為可改變大小的動態陣列
for(int i=10;i>=2;i-=2)
n.add(i);
n.add(40);
n.add(60); //以上所加入的元素將依據加入的順序排列
n.add(0, 80); //指定索引值為 0 加入元素
n.add(1, 100);
System.out.println("元素個數:"+n.size());
System.out.println("集合內容:"+n);
n.add(1, 150); //插入點後的所有元素其索引值都會改變
System.out.println("集合內容:"+n);
n.set(2, 10); //將索引值 2 的元素以 10 取代
System.out.println("集合內容:"+n);
//n.remove(1); //移除索引值為 1 的元素
n.remove(n.indexOf(150)); //移除值為 150 的元素 (索引值為 1)
System.out.println("集合內容:"+n);
System.out.println("第一個元素值為10的索引值:"+n.indexOf(10)); //由前往後搜尋
System.out.println("最後一個元素值為10的索引值:"+n.lastIndexOf(10)); //由後往前搜尋
System.out.println("集合中索引值為3的元素:"+n.get(3));
System.out.println("最大的元素值為:"+Collections.max(n));
System.out.println("最小的元素值為:"+Collections.min(n));
Collections.sort(n);
System.out.print("遞增排序:");
for(int i:n)
System.out.print(i+" ");
System.out.println();
System.out.print("遞減排序:");
for(int i=n.size()-1; i>=0; i--)
System.out.print(n.get(i)+" ");
System.out.println(); //集合中索引值為 3 的元素
}
}
複製代碼
作者:
朱春男
時間:
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