之前我们对List集合系列进行了比较详细的分析,今天我们来研究一下java集合中的另一个分支系列——Queue。
队列是一种特殊的线性结构。它只允许在表头进行删除操作,而在表尾进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO)线性表。
public interface Queue<E>
extends Collection<E>
Queue接口位于java.util包中,Queue接口与List、Set同一级别,都是继承至Collection接口。所以Queue也是java集合体系中的一部分。
Queue源码中提供了一些入队出队的方法,如下:
package java.util;
public interface Queue<E> extends Collection<E> {
//将指定的元素插入到此队列中,插入成功返回true,插入失败(容量不足)返回false
boolean add(E e);
//将指定的元素插入到此队列中,插入成功返回true,插入失败(容量不足)返回false
boolean offer(E e);
//检索并删除此队列的头
E remove();
//检索并删除此队列的头,如果为空,返回null
E poll();
//检索但不删除此队列的头
E element();
//检索但不删除此队列的头,如果队列为空返回null
E peek();
}
Deque是Double ended queue的缩写,即双端队列,它是支持两端元素插入和移除的线性集合。
Deque继承至Queue,也被LinkedList所实现,所以它也可以当做先进先出的队列使用。
public interface Deque<E>
extends Queue<E>
在Deque中不仅继承了Queue和Collection中的方法,也还新加入了部分新方法。
//在此双端队列的队头插入指定元素
void addFirst(E e);
//在此双端队列的队尾插入指定元素
void addLast(E e);
//在此双端队列的队头插入指定元素
boolean offerFirst(E e);
//在此双端队列的队尾插入指定元素
boolean offerLast(E e);
//检索并删除此deque的第一个元素。
E removeFirst();
//检索并删除此deque的最后一个元素。
E removeLast();
//检索并删除此deque的第一个元素,如果此deque为空,则返回 null 。
E pollFirst();
//检索并删除此deque的最后一个元素,如果此deque为空,则返回 null 。
E pollLast();
//检索,但不删除,这个deque的第一个元素。
E getFirst();
//检索,但不删除,这个deque的最后一个元素。
E getLast();
//检索,但不删除,此deque的第一个元素,如果这个deque是空的返回 null。
E peekFirst();
//检索,但不删除,此deque的最后一个元素,如果这个deque是空的返回 null。
E peekLast();
//从此deque中删除指定元素的第一个出现。
boolean removeFirstOccurrence(Object o);
//从此deque中删除指定元素的最后一个出现。
boolean removeLastOccurrence(Object o);
//将元素推送到由此deque表示的堆栈
void push(E e);
//从这个deque表示的堆栈中弹出一个元素。
E pop();
AbstractQueue是Queue的一个实现类,它继承至AbstractCollection,也实现了Queue接口。
public abstract class AbstractQueue<E>
extends AbstractCollection<E>
implements Queue<E>
AbstractQueue类提供了一些Queue操作的骨架实现。
public boolean add(E e) {
if (offer(e))
return true;
else
throw new IllegalStateException("Queue full");
}
public boolean addAll(Collection<? extends E> c) {
if (c == null)
throw new NullPointerException();
if (c == this)
throw new IllegalArgumentException();
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;
}
public void clear() {
while (poll() != null)
;
}
public E element() {
E x = peek();
if (x != null)
return x;
else
throw new NoSuchElementException();
}
public E remove() {
E x = poll();
if (x != null)
return x;
else
throw new NoSuchElementException();
}
ArrayDeque是Deque的一个实现类,他继承至AbstractCollection,并且实现了Deque, Cloneable, Serializable接口,它是可复制、可序列化的。
public class ArrayDeque<E> extends AbstractCollection<E>
implements Deque<E>, Cloneable, Serializable
ArrayDeque底层使用数组实现,数组的容量可以动态的扩充。
它不是线程安全的; 在没有外部同步的情况下,它们不支持多线程的并发访问。
ArrayDeque可以当做栈或者队列使用,且效率比Stack和LinkedList更高。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_43598687/article/details/121632345
内容来源于网络,如有侵权,请联系作者删除!