双向队列接口Deque

Deque是一种支持双向插入和删除的线性集合,全称”double end queue”。

Deque说明

 

Deque实现类大多不限定元素数量,不过Deque接口中也定义了一些方法来支持限定数量队列的元素操作。接口中定义的很多看似重复元素操作方法,只是结果行为稍有差别。

BlockingDeque在Deque接口的基础上实现阻塞功能,LinkedBlockingDeque基于链表实现了BlockingDeque接口,内部实现了阻塞方法、超时阻塞方法和非阻塞方法。

ConcurrentLinkedDeque类实现了Deque接口,它基于链表结构,并且是线程安全的。

接口行为

Deque接口定义了两端操作队列的方法,每个方法都存在两种形式,一种操作失败的情况下会抛出异常,另一种操作失败后返回特定值(返回Null或False)。例如插入元素时,如果限定了队列容量,而又空间不足,add(E e)方法抛出异常,而offer(E e)方法返回false。

插入方法:

boolean add(E e);

向队列尾部添加元素,等价addLast(E e)方法,如果限定了容量,而又没有足够空间时,会抛出IllegalStateException。因此限定容量时更适合使用offer(E e)方法,offer方法在空间不足的情况下不会抛出异常,而是返回false

void addLast(E e);

等价于add(E e)方法。

void addFirst(E e);

向队列头部添加元素,如果限定了容量,而又没有足够空间时,会抛出IllegalStateException。因此限定容量时更适合使用offerFirst(E e)方法,offerFirst方法在空间不足的情况下不会抛出异常,而是返回false

boolean offer(E e);

boolean offerLast(E e);

boolean offerFirst(E e);

offer方法与add方法相似,仅在限定容量队列中并且空间不足的情况下表现有些区别,offer空间不足情况下返回false而非抛出异常,因此限定容量的双向队列,最好使用offer方法,其表现更为友好。

获取但不删除方法:

E getFirst();

E getLast();

限定容量非友好方法,getFirst()方法从头部获取元素,getLast()方法从尾部获取,如果队列中没有元素,抛出NoSuchElementException异常。

E peek();

E peekFirst();

E peekLast();

限定容量友好方法,peek()方法对应上面的getFirst()方法,队列空时返回Null。peek()方法和peekFirst()方法等价,都是从头部获取元素。

移除方法:

E remove();

E removeFirst();

E removeLast();

限定容量非友好方法,remove()方法与removeFirst()方法等价,都是从头部获取元素,removeLast()方法从尾部获取,如果队列中没有元素,抛出NoSuchElementException异常。

E poll();

E pollFirst();

E pollLast();

限定容量友好方法,poll()方法对应上面的remove()方法,队列空时返回Null。poll ()方法和poll First()方法等价,都是从头部删除元素,pollLast()方法从尾部删除元素。

删除指定元素:

boolean removeFirstOccurrence(Object o);

boolean removeLastOccurrence(Object o);

两个方法分部第一个和最后一个匹配的元素,如果存在返回true否则返回false。

默认情况下,队列(Queue)元素从尾部添加,从头部删除,因此Deque中定义的方法add等价addLast,remove等价removeFirst,peek等价peekFirst。

Deque定义了两个堆栈方法,因此可以像会用栈结构一样使用Deque的实现类:

void push(E e);

入栈方法,等价addFirst(E e)方法,向队列头部添加元素。

E pop();

出栈方法,等价removeFirst()方法,从队列头部删除元素。

Deque定义集合相关方法:

Iterator<E> iterator();

返回元素遍历器,从头至尾遍历。

Iterator<E> descendingIterator();

返回元素反向遍历器,从尾至头遍历。

应用场景

设计队列这种集合结构,是为了存储待处理对象,队列接口为这些对象的存取提供便利的方法:“A collection designed for holding elements prior to processing”。

Deque的实现类适用于:

  1. FIFO场景
  2. LIFO场景

FIFO是所有队列的基础功能,基于双向的特性Deque也实现了LIFO。Deque接口中定义了堆栈的方法push和pop,因此可以使用ConcurrentLinkedDeque代替Stack,两者都是线程安全的,但Stack使用了synchronized。

Stack类中定义的方法:

public synchronized E pop()

public synchronized E peek()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的Queue和Deque是两种不同的数据结构。 1. Queue(单向队列)是一种FIFO(先进先出)的数据结构,它继承自Collection接口。Queue有一个直接子类PriorityQueue,它是一个基于优先级的队列,元素按照优先级进行排序。Queue的常用方法包括add()、offer()、remove()、poll()、element()和peek()等。 2. Deque双向队列)是一种支持在两端添加或移除元素的数据结构,它继承自Queue接口Deque有两个直接子类:LinkedList和ArrayDeque。LinkedList是基于链表实现的双向队列,而ArrayDeque是基于数组实现的双向队列Deque的常用方法包括addFirst()、addLast()、offerFirst()、offerLast()、removeFirst()、removeLast()、pollFirst()、pollLast()、getFirst()、getLast()、peekFirst()和peekLast()等。 以下是Java中使用Queue和Deque的示例代码: ```java import java.util.Queue; import java.util.LinkedList; import java.util.ArrayDeque; public class QueueDequeExample { public static void main(String[] args) { // 使用Queue Queue<String> queue = new LinkedList<>(); queue.add("apple"); queue.add("banana"); queue.add("orange"); System.out.println("Queue: " + queue); System.out.println("First element: " + queue.peek()); System.out.println("Removed element: " + queue.poll()); System.out.println("Queue after removal: " + queue); // 使用Deque Deque<Integer> deque = new ArrayDeque<>(); deque.addFirst(1); deque.addLast(2); deque.addLast(3); System.out.println("Deque: " + deque); System.out.println("First element: " + deque.getFirst()); System.out.println("Last element: " + deque.getLast()); System.out.println("Removed first element: " + deque.removeFirst()); System.out.println("Deque after removal: " + deque); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值