美文网首页
Java 集合之 Queue

Java 集合之 Queue

作者: Tinyspot | 来源:发表于2023-04-11 21:49 被阅读0次

1. 线性数据结构

  • 数组、链表、栈、队列

1.1 队列

Queue 是一种遵循先进先出(FIFO: First In, First Out)原则的数据集合,数据在Queue中的流动是单向的,从队尾流向队首

1.2 Queue 接口

// 继承基础集合接口Collection
public interface Queue<E> extends Collection<E> {

    boolean add(E e);  // throwing an IllegalStateException if no space
    boolean offer(E e);

    // Retrieves and removes the head of this queue
    E remove();
    E poll();

    // Retrieves, but does not remove, the head of this queue
    E element(); // throwing an NoSuchElementExceptio if this queue is empty
    E peek();
}

1.3 Deque接口

  • Deque 是双端队列
  • 在队尾和队首都可以 出队/入队
public interface Deque<E> extends Queue<E> {
    void addFirst(E e);
    void addLast(E e);

    boolean offerFirst(E e);
    boolean offerLast(E e);

    E removeFirst();
    E removeLast();

    E pollFirst();
    E pollLast();

    E getFirst();
    E getLast();

    E peekFirst();
    E peekLast();

    boolean removeFirstOccurrence(Object o);
    boolean removeLastOccurrence(Object o);
}

2. LinkedList 类

2.1 双向链表

LinkedList 有两个成员变量 first 和 last,类型为Node<E>,表示队列中的首尾节点

public class LinkedList<E> extends AbstractSequentialList<E>
            implements List<E>, Deque<E>, Cloneable, java.io.Serializable {
    transient int size = 0;
    transient Node<E> first;
    transient Node<E> last;
}

Node<E>是链表的一个节点,成员变量 item 用来存储具体的元素值,变量 next 和变量 prev 表示当前节点的后一个节点和上一个节点

    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

2.2 插入元素

  • add()
  • offer()
  • offerFirst() / offerLast()
    public boolean offer(E e) {
        return add(e);
    }

    public boolean add(E e) {
        linkLast(e);
        return true;
    }

    void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        // 集合修改次数+1
        modCount++;
    }
    public boolean offerFirst(E e) {
        addFirst(e);
        return true;
    }
    public void addFirst(E e) {
        linkFirst(e);
    }
    private void linkFirst(E e) {
        final Node<E> f = first;
        final Node<E> newNode = new Node<>(null, e, f);
        first = newNode;
        if (f == null)
            last = newNode;
        else
            f.prev = newNode;
        size++;
        modCount++;
    }

2.3 删除元素

  • poll()
  • pollFirst() / pollLast()
    public E poll() {
        final Node<E> f = first;
        return (f == null) ? null : unlinkFirst(f);
    }
    public E pollFirst() {
        final Node<E> f = first;
        return (f == null) ? null : unlinkFirst(f);
    }

最终调用的都是 unlinkFirst() 和unlinkLast() ,表示删除链表头部和链表尾部的节点

    private E unlinkFirst(Node<E> f) {
        // assert f == first && f != null;
        final E element = f.item;
        final Node<E> next = f.next;
        f.item = null;
        f.next = null; // help GC
        first = next;
        if (next == null)
            last = null;
        else
            next.prev = null;
        size--;
        modCount++;
        return element;
    }

相关文章

网友评论

      本文标题:Java 集合之 Queue

      本文链接:https://www.haomeiwen.com/subject/gqknddtx.html