java中Queue和Deque详解

291 阅读3分钟

「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

这里首先说一下 Deque 是一个接口 但它实现 Queue image.png

Queue和 Deque 共有方法
boolean add(E e);在队列尾部添加一个元素 成功返回true 失败抛出异常
boolean offer(E e);在队列尾部添加一个元素 成功返回true 失败返回false
E remove();取出队列的第一个元素,并从队列中移除该元素,成功返回该元素,失败返回false,如果指定元素为空,抛出NullPointerException
E poll();取出队列第一个元素,并从队列中移除该元素,成功返回该元素,失败返回null。
E element();取出队列第一个元素,不移除,成功返回该元素,失败抛出异常
E peek();取出队列第一个元素,不移除,成功返回该元素,失败返回null。
  1. 添加演示:

    ps:因为不同队列的具体实现方式不同,有的队列 add方法里面调用的就是 offer(java.util.PriorityQueue#add )

    图片.png

    为了效果更明显,所以选取 ArrayBlockingQueue 作为实现类,进行演示

  • add 和 offer 图片.png 图片.png 可以看到 offer 添加失败返回false,而 add 添加失败 抛出异常。
  1. 移除演示
    • 正常移除测试: 图片.png 通过输出 queue.size 我们可以看出,element 和 peek 方法,是取出元素,但不会从队列中移除,而 poll 和 remove 是在取出元素的同时,从队列中移除该元素

    • 异常移除测试:

      图片.png 大家可以看到,peek 和 poll 方法取不到元素会返回 null,而 element 和 remove 方法取不到元素会抛异常

因为Deque是双端队列,所以它可以从头部添加或取出,也可以从尾部添加或取出,所以下面是它的独有方法。

Deque的独有方法
void addFirst(E e);在队列头部 添加一个元素,失败抛出异常
void addLast(E e);在队列尾部 添加一个元素,失败抛出异常
boolean offerFirst(E e);在队列头部 添加一个元素,成功返回true ,失败返回false
boolean offerLast(E e);在队列尾部 添加一个元素,成功返回true ,失败返回false
E removeFirst();取出队列的第一个元素,并移除该元素,成功返回该元素,失败抛出异常
E removeLast();取出队列的最后一个元素,并移除该元素,成功返回该元素,失败抛出异常
E pollFirst();取出队列的第一个元素,并移除该元素,成功返回该元素,失败返回null
E pollLast();取出队列的最后一个元素,并移除该元素,成功返回该元素,失败返回null
E getFirst();取出队列的第一个元素,不移除,成功返回该元素,失败抛出异常
E getLast();取出队列的最后一个元素,不移除,成功返回该元素,失败抛出异常
E peekFirst();取出队列的第一个元素,不移除,成功返回该元素,失败返回null
E peekLast();取出队列的最后一个元素,不移除,成功返回该元素,失败返回null
boolean removeFirstOccurrence(Object o);移除双向队列中第一个出现的该元素,成功返回true,失败抛出异常
boolean removeLastOccurrence(Object o);移除双向队列中最后一个出现的该元素,成功返回true,失败抛出异常
void push(E e);在双向队列头部 添加一个元素 ,失败抛出异常
E pop();取出队列的第一个元素,并移除该元素,队列为空时 抛出NoSuchElementException
boolean contains(Object o);判断队列中是否包含指定元素,包含返回true 否则返回false
这里这个方法挺多的,我已经把具体含义都写出来了,就不再跟大家演示了。