広告

Java : AbstractQueue - API使用例

AbstractQueue (Java SE 20 & JDK 20) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。


概要

このクラスは、Queueのいくつかのオペレーションのスケルトン実装を提供します。 このクラス内の実装が適切なのは、ベース実装でnull要素が許可されない場合です。 add、remove、およびelementメソッドは、それぞれoffer、poll、およびpeekに基づいていますが、falseまたはnullを返して失敗を示す代わりに、例外をスローします。

クラス構成

必要最低限の独自実装の例です。
(注意:実装に ArrayList を使っていますが、効率はよくないかもしれません)

class MyQueue extends AbstractQueue<String> {
    private final List<String> values = new ArrayList<>();

    @Override
    public Iterator<String> iterator() {
        return values.iterator();
    }

    @Override
    public int size() {
        return values.size();
    }

    @Override
    public boolean offer(String s) {
        Objects.requireNonNull(s);
        return values.add(s);
    }

    @Override
    public String poll() {
        return values.isEmpty() ? null : values.remove(0);
    }

    @Override
    public String peek() {
        return values.isEmpty() ? null : values.get(0);
    }
}
final var queue = new MyQueue();
queue.offer("aaa");
queue.offer("bbb");
queue.offer("ccc");

System.out.println(queue); // [aaa, bbb, ccc]

System.out.println(queue.poll()); // aaa
System.out.println(queue.poll()); // bbb
System.out.println(queue.poll()); // ccc

コンストラクタ

AbstractQueue ()

サブクラスにより使用されるコンストラクタです。

class MyQueue extends AbstractQueue<String> {
    private final List<String> values = new ArrayList<>();

    @Override
    public Iterator<String> iterator() {
        return values.iterator();
    }

    @Override
    public int size() {
        return values.size();
    }

    @Override
    public boolean offer(String s) {
        Objects.requireNonNull(s);
        return values.add(s);
    }

    @Override
    public String poll() {
        return values.isEmpty() ? null : values.remove(0);
    }

    @Override
    public String peek() {
        return values.isEmpty() ? null : values.get(0);
    }
}
final var queue = new MyQueue();
queue.offer("aaa");
queue.offer("bbb");
queue.offer("ccc");

System.out.println(queue); // [aaa, bbb, ccc]

System.out.println(queue.poll()); // aaa
System.out.println(queue.poll()); // bbb
System.out.println(queue.poll()); // ccc

メソッド

boolean add (E e)

容量制限に違反することなく、指定された要素をこのキューにすぐに挿入できる場合はそうします。成功した場合はtrueを返し、その時点で使用可能な空き領域が存在しない場合はIllegalStateExceptionをスローします。

// capacity = 3
final AbstractQueue<String> queue = new ArrayBlockingQueue<>(3);
System.out.println(queue); // []

System.out.println(queue.add("aaa")); // true
System.out.println(queue); // [aaa]

System.out.println(queue.add("bbb")); // true
System.out.println(queue); // [aaa, bbb]

System.out.println(queue.add("ccc")); // true
System.out.println(queue); // [aaa, bbb, ccc]

try {
    queue.add("ddd");
} catch (IllegalStateException e) {
    System.out.println("IllegalStateException! : " + e.getMessage());
}

// 結果
// ↓
//IllegalStateException! : Queue full

boolean addAll (Collection<? extends E> c)

指定されたコレクション内のすべての要素をこのキューに追加します。

final AbstractQueue<String> queue = new ArrayBlockingQueue<>(10);
System.out.println(queue); // []

System.out.println(queue.addAll(List.of("a1"))); // true
System.out.println(queue); // [a1]

System.out.println(queue.addAll(List.of("b1", "b2"))); // true
System.out.println(queue); // [a1, b1, b2]

System.out.println(queue.addAll(List.of("c1", "c2", "c3"))); // true
System.out.println(queue); // [a1, b1, b2, c1, c2, c3]

void clear ()

すべての要素をキューから削除します。

final AbstractQueue<String> queue = new ArrayBlockingQueue<>(10);
System.out.println(queue); // []

queue.add("a");
System.out.println(queue); // [a]

queue.add("b");
System.out.println(queue); // [a, b]

queue.clear();
System.out.println(queue); // []

E element ()

キューの先頭を取得しますが、削除しません。

final AbstractQueue<String> queue = new ArrayBlockingQueue<>(10);
System.out.println(queue); // []

queue.add("aaa");
queue.add("bbb");
queue.add("ccc");

System.out.println(queue.element()); // aaa
System.out.println(queue); // [aaa, bbb, ccc]

System.out.println(queue.remove()); // aaa
System.out.println(queue); // [bbb, ccc]

System.out.println(queue.element()); // bbb
System.out.println(queue); // [bbb, ccc]

System.out.println(queue.remove()); // bbb
System.out.println(queue); // [ccc]

System.out.println(queue.element()); // ccc
System.out.println(queue); // [ccc]

System.out.println(queue.remove()); // ccc
System.out.println(queue); // []

try {
    queue.element();
} catch (NoSuchElementException e) {
    System.out.println("NoSuchElementException!");
}

// 結果
// ↓
//NoSuchElementException!

E remove ()

キューの先頭を取得および削除します。

final AbstractQueue<String> queue = new ArrayBlockingQueue<>(10);
System.out.println(queue); // []

queue.add("aaa");
queue.add("bbb");
queue.add("ccc");

System.out.println(queue); // [aaa, bbb, ccc]

System.out.println(queue.remove()); // aaa
System.out.println(queue); // [bbb, ccc]

System.out.println(queue.remove()); // bbb
System.out.println(queue); // [ccc]

System.out.println(queue.remove()); // ccc
System.out.println(queue); // []

try {
    queue.remove();
} catch (NoSuchElementException e) {
    System.out.println("NoSuchElementException!");
}

// 結果
// ↓
//NoSuchElementException!

AbstractCollectionで宣言されたメソッド

contains, containsAll, isEmpty, iterator, remove, removeAll, retainAll, toArray, toArray, toString

Java API 使用例 : AbstractCollection」をご参照ください。

Collectionで宣言されたメソッド

contains, containsAll, equals, hashCode, isEmpty, iterator, parallelStream, remove, removeAll, removeIf, retainAll, size, spliterator, stream, toArray, toArray, toArray

Java API 使用例 : Collection」をご参照ください。

Iterableで宣言されたメソッド

forEach

Java API 使用例 : Iterable」をご参照ください。

Queueで宣言されたメソッド

offer, peek, poll

Java API 使用例 : Queue」をご参照ください。


関連記事

ページの先頭へ