セット、キュー

Javaにおけるデータ型と例外処理

Jim White

Java Developer

Set インターフェース

  • SetCollection の一種
    • 重複要素を許可しない
      • 各要素の一意性を保証
    • 一般に Set は無順序(インデックスなし)
  • List はピルケースのように各要素が特定の位置に入る
  • Set は袋に無作為に入っているイメージ

List は各要素が特定の位置(インデックス)に格納されるピルケースのようなもの

Set は要素が無作為・無順序に入った袋のようなもの

1 Images courtesy Wikimedia Commons
Javaにおけるデータ型と例外処理

List と Set の比較

  • Set を使う場面
    • 要素の一意性を保証
    • ルックアップが速い
      • 例: 要素が Set に含まれるかの確認
    • コレクションが大きいほどメモリ効率が良い
    • キャッシュのメンバーシップ判定に有効
      • 例: 文書内のユニークな単語の抽出
Javaにおけるデータ型と例外処理

List と Set の比較

  • List を使う場面
    • 要素の順序を保持し、重複を許可
    • 位置指定アクセスで高性能
    • インデックスによる追加・削除が高速
    • 要素順序が重要な場合に有効
      • 例: 手順の管理、プレイリスト
Javaにおけるデータ型と例外処理

Set の実装

  • Set には多くの実装
    • HashSet は代表的
  • HashSet
    • 無順序の要素の袋
    • 挿入・削除・検索が他の Set より高速
    • 一般に他の Set よりメモリ消費が多い
    • null を1つだけ格納可能

HashSet は無順序で null を1つ許可

Javaにおけるデータ型と例外処理

HashSet の作成

  • ジェネリックのパラメータ化コンストラクタで HashSet を作成
    HashSet<String> set = new HashSet<String>();
    
  • HashSetjava.util パッケージにあります
    • import が必要
    • 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)のデータ構造
    • 最初に追加された要素が最初に削除される
    • チケット売り場の列のようなもの
    • 先頭(head)と末尾(tail)がある

先頭(開始)と末尾(終了)が示されたキューの図

  • Queue には複数の実装
    • 動作や操作は類似
Javaにおけるデータ型と例外処理

ArrayBlockingQueue

  • 代表的な Queue 実装
    • 内部は配列
  • 注意: ArrayBlockingQueuejava.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)
    • 容量超過時、.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()
    • 空のとき .remove() は例外を送出
    • 空のとき .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におけるデータ型と例外処理

Ayo berlatih!

Javaにおけるデータ型と例外処理

Preparing Video For Download...