Lists

Java 的資料型別與例外狀況

Jim White

Java Developer

List 介面

  • List 介面,為 Collection 的子介面
    • 定義「有序」的物件集合
    • 可包含重複物件
  • List 的多種實作
    • 行為大致相同
    • 實作決定底層如何管理物件
Java 的資料型別與例外狀況

List 的實作

  • ArrayList:可調整大小、具索引(如陣列)、有序的物件清單

ArrayList 類似具有索引元素的 Java 陣列

  • LinkedList:物件以連結串接到下一個與前一個物件。

LinkedList 是以指標串接的物件清單

  • 無論實作為何,新增、移除、變更物件的用法相同
1 See https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/List.html for List types and details
Java 的資料型別與例外狀況

ArrayList

  • 使用 new 建立實例,並用泛型指定內容型別
  • .add(object) 將物件加到清單尾端
  • .get(index) 取用物件
    • ArrayList 使用從 0 開始的索引
  • .set(index, object) 取代/變更物件
  • .remove(index) 移除物件
  • .clear() 清空所有物件
  • .size() 取得物件數量
import java.util.ArrayList;
...
ArrayList<String> animals
  = new ArrayList<String>();

animals.add("horse"); animals.add("cow"); animals.add("horse"); // Duplicates allowed
String c = animals.get(1); // c="cow" animals.set(1, "chicken");
// Removes the first horse animals.remove(0); // Removes all objects animals.clear();
animals.size();
Java 的資料型別與例外狀況

物件與基礎型別

  • 使用包裝類別可將基礎型別加入任何 Collections Framework 物件
  • 加入的基礎型別會自動「裝箱」
    • 「自動裝箱」:自動以包裝類別包起基礎型別的過程
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(new Integer(5));
list.add(6);  // 6 會自動以 Integer 包裝後加入
  • 自動裝箱適用於所有 Collections Framework 物件
Java 的資料型別與例外狀況

異質集合

  • Collections Framework 的資料結構可以是「異質」的
    • 異質=可容納不同型別的物件
    • Object 作為參數化型別
ArrayList<Object> list = new ArrayList<Object>(); // 允許任何物件
list.add(new Integer(5)); // 加入 Integer
list.add(6); // 以自動裝箱加入 Integer
list.add("Hello"); // 加入 String
Java 的資料型別與例外狀況

迴圈遍歷 List

  • 使用「for-each」語法迴圈走訪 List 內的物件
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");

for (String animal : animals) { // for-each 走訪 ArrayList 全部元素
    System.out.println(animal);
}
horse
cow
chicken
Java 的資料型別與例外狀況

List 的 println 輸出

  • List 實例(如 ArrayList)的內容可用 println 顯示
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");
System.out.println(animals);  // 顯示 ArrayList 的所有元素

ArrayList<Object> list = new ArrayList<Object>();
list.add(5);
list.add("Hello");
System.out.println(list);  // 顯示 ArrayList 的所有元素
[horse, cow, chicken]
[5, Hello]
Java 的資料型別與例外狀況

LinkedList

  • LinkedList 的建立方式與 ArrayList 相同
  • LinkedListArrayList 方法相同
import java.util.LinkedList;
...
LinkedList<String> cars // Create a new ...
  = new LinkedList<String>(); // ... LinkedList
cars.add("Ford"); // Add an object to the list
cars.add("Mercedes");
String c = cars.get(1);
cars.set(1, "Toyota"); // Replace an object
System.out.println(cars); // Display the list
cars.remove(0); // Remove an object
cars.clear();  // Remove all objects
cars.size(); // Get the list length
[Ford, Toyota]
Java 的資料型別與例外狀況

LinkedList 進階方法

  • 其他常用方法
    • addFirst() 加到清單開頭
    • addLast() 加到清單尾端
    • removeFirst() 從開頭移除
    • removeLast() 從尾端移除
cars.addFirst("Fiat"); // Add to the beginning
cars.addLast("BMW"); // Add the the end
cars.removeFirst(); // Remove the first object
cars.removeLast(); // Remove the last object
Java 的資料型別與例外狀況

集合型別的相似性

  • ArrayListLinkedList 外觀與用法類似
    • Collections Framework 的其他型別也有相似性
    • 這是刻意設計
  • 它們共享介面:List
    • 多型(「多種形式」)的例子
Java 的資料型別與例外狀況

ArrayList 與 LinkedList 比較

  • ArrayListLinkedList(或任何 List)的操作相同
    • 選擇哪種 List 取決於用途
  • ArrayList 的考量:
    • 隨機存取快(例如:list.get(11)
    • 在中間新增或移除元素較慢
    • 因為插入/移除時物件需實體搬移

在 ArrayList 中間新增物件需要大量搬移

Java 的資料型別與例外狀況

ArrayList 與 LinkedList 比較

  • LinkedList 的考量:
    • 隨機存取較慢(例如:list.get(11)
    • 在中間新增或移除元素較快
    • 因為不需實體搬移物件,只改變部分參照

在 LinkedList 中間新增物件只需調整部分指標

Java 的資料型別與例外狀況

一起來練習吧!

Java 的資料型別與例外狀況

Preparing Video For Download...