Set、Queue

Java 的資料型別與例外狀況

Jim White

Java Developer

Set 介面

  • Set 也是一種 Collection
    • 不允許重複物件
      • 保證每個元素唯一
    • Set 一般無序(因此沒有索引)
  • List 像藥盒,每個物件都在固定位置
  • Set 像麻布袋,物件隨機放在袋中

List 像藥盒,物件依特定位置的索引存放

Set 像麻布袋,隨機無序地裝著物件

1 圖片來源:Wikimedia Commons
Java 的資料型別與例外狀況

List vs Set

  • 何時用 Set
    • 保證元素唯一
    • 查找較快
      • 檢查物件是否在 Set
    • 集合越大,記憶體效率越高
    • 適合快取的成員測試
      • 例:找出文件中的不重複單字
Java 的資料型別與例外狀況

List vs Set

  • 何時用 List
    • 保留元素順序且允許重複
    • 按位置存取效能較佳
    • 依索引新增/刪除效能較佳
    • 適合重視順序的情境
      • 例:管理流程步驟或歌單
Java 的資料型別與例外狀況

Set 實作

  • Set 有多種實作
    • HashSet 很常用
  • HashSet
    • 無序的物件袋
    • 插入、刪除、查找通常比其他 Set 實作更快
    • 一般比其他 Set 實作更耗記憶體
    • 可儲存一個 null

HashSet 是無序物件袋,允許一個 null

Java 的資料型別與例外狀況

HashSet 建立

  • 用泛型參數化建構子建立 HashSet
    HashSet<String> set = new HashSet<String>();
    
  • HashSet 位於 java.util 套件
    • 需要匯入
    • import java.util.HashSet
Java 的資料型別與例外狀況

HashSet 方法

  • .add().remove() 新增或移除物件
  • .remove().add() 以取代物件
  • .contains() 檢查物件是否已存在
  • 會忽略重複項
  • 允許 null
  • 不保證順序
set.add("France");
set.add("Japan");
set.add("Brazil");
set.add("Egypt");
set.add(null); // null is allowed
set.remove("Brazil");
boolean z =
  set.contains("France"); // z is true
set.add("Japan"); // Ignored
System.out.println(set);
[null, Japan, Egypt, France]
Java 的資料型別與例外狀況

Queue 介面

  • Queue 資料結構以先進先出(FIFO)處理物件
    • 最先加入者最先移除
    • 如同售票口排隊
    • 有隊首與隊尾

Queue 圖示,標示隊首(起點)與隊尾(終點)

  • Queue 有多種實作
    • 行為與操作相近
Java 的資料型別與例外狀況

ArrayBlockingQueue

  • 常見的 Queue 實作
    • 底層使用陣列
  • 注意:ArrayBlockingQueue 位於 java.util.concurrent 套件中
    • 不在 java.util 套件
Java 的資料型別與例外狀況

ArrayBlockingQueue 建立

  • 用泛型參數化建構子建立 ArrayBlockingQueue
    • 需在建構子中指定容量(物件數上限)
import java.util.concurrent;  // 放在類別最上方

// 建立可儲存 4 個 String 的新佇列
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(4);
Java 的資料型別與例外狀況

ArrayBlockingQueue 方法

  • .add(object).offer(object) 加到隊尾
    • Queue 達容量時,.add(object) 會丟出例外
    • 達容量時,.offer(object) 會忽略新物件
ArrayBlockingQueue<String> queue 
    = new ArrayBlockingQueue<String>(4);
queue.offer("France");
queue.offer("Japan");
queue.offer("Brazil");
queue.offer("Egypt");
queue.offer("China"); // Ignores China

// Causes IllegalStateException
// queue.add("China");

System.out.println(queue);
[France, Japan, Brazil, Egypt]
Java 的資料型別與例外狀況

ArrayBlockingQueue 方法

  • .remove().poll() 自隊首移除
    • Queue 為空時,.remove() 會拋出例外
    • Queue 為空時,.poll() 回傳 null
  • 不允許 null
ArrayBlockingQueue<String> queue 
    = new ArrayBlockingQueue<String>(4);
String x = queue.poll(); // x is null
// Causes NoSuchElementException
// String y = queue.remove();

queue.offer("France");
String next = queue.poll();
System.out.println(next);
France
Java 的資料型別與例外狀況

一起來練習吧!

Java 的資料型別與例外狀況

Preparing Video For Download...