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 有多种实现
    • 行为与操作相近
Java 的数据类型与异常

ArrayBlockingQueue

  • 常用的 Queue 实现
    • 底层基于数组
  • 注意:ArrayBlockingQueue 位于 java.util.concurrent
    • 不在 java.util 包中
Java 的数据类型与异常

ArrayBlockingQueue 构造

  • 使用泛型构造函数创建 ArrayBlockingQueue
    • 通过构造函数指定容量(最大元素数)
import java.util.concurrent;  // 写在类的顶部

// 创建可存 4 个字符串的队列
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(4);
Java 的数据类型与异常

ArrayBlockingQueue 方法

  • .add(object).offer(object) 追加到队尾
    • .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 的数据类型与异常

Passons à la pratique !

Java 的数据类型与异常

Preparing Video For Download...