Java中队列Queue和Deque的区别与代码实例

目录
  • 一、Queue和Deque
  • 二、api对比
  • 三、代码实例
    • 1、queue
    • 2、deque
  • 总结

一、Queue和Deque

Queue以及Deque都是继承于Collection,Deque是Queue的子接口。

Queue是FIFO的单向队列,Deque是双向队列。

Queue有一个直接子类PriorityQueue,而Deque中直接子类有两个:LinkedList以及ArrayDeque。

PriorityQueue的底层数据结构是数组,而无边界的形容,那么指明了PriorityQueue是自带扩容机制的。

ArrayDeque是无初始容量的双端队列,LinkedList则是双向链表。

PriorityQueue可以作为堆使用,而且可以根据传入的Comparator实现大小的调整,会是一个很好的选择。
ArrayDeque通常作为栈或队列使用,但是栈的效率不如LinkedList高。
LinkedList通常作为栈或队列使用,但是队列的效率不如ArrayQueue高。

二、api对比

Queue Deque
增加 add add、addFirst、addLast
offer offer、offerFirst、offerLast
移除 remove remove、removeFirst、removeLast
poll pop、poll、pollFirst、pollLast
获取 element element、getFirst、getLast
peek peek、peekFirst、peekLast

备注:

1、add和offer区别

  • add() : 添加元素,如果添加成功则返回true,如果队列是满的,则抛出异常
  • offer() : 添加元素,如果添加成功则返回true,如果队列是满的,则返回false

2、remove和poll

  • remove() : 移除队列头的元素并且返回,如果队列为空则抛出异常
  • poll() : 移除队列头的元素并且返回,如果队列为空则返回null
  • Deque新增了一个pop方法,也是移除队列头的元素并且返回,如果队列为空则抛出异常。

3、element和peek

  • element() :返回队列头元素但不移除,如果队列为空,则抛出异常
  • peek() :返回队列头元素但不移除,如果队列为空,则返回null
  • 因此,增加推荐使用add,移除推荐使用poll,获取元素推荐使用peek。

三、代码实例

1、queue

队列(queue)是一种常用的数据结构,可以将队列看做是一种特殊的线性表,该结构遵循的先进先出原则。Java中,LinkedList实现了Queue接口,因为LinkedList进行插入、删除操作效率较高。

初始化:

Queue <Integer> q = new LinkedList<Integer>();

常用方法:

**add(E e)😗*将指定元素插入此队列尾部,成功返回true。

**offer(E e)😗*将指定元素插入队列尾部,成功返回true。当队列有容量 限制时,此方法由于add,因为后者可能无法插入,而只是抛出IllegalStateException异常。

**remove()😗*获取并移除队列的头部元素,队列为空抛出异常。

**poll():**获取并移除队列的头部元素,队列为空返回null。

**element()😗*获取但是不移除队列头部元素,队列为空抛出异常。

**peek()😗*获取但是不移除队列头部元素,队列为空返回null。

**isEmpty()😗*判断队列是否为空,为空返回true。

**size()😗*获取队列元素数量.

实例代码:

public static void test01(){
    Queue<String> queue = new LinkedList<>();
    // add()和remove()方法在失败的时候会抛出异常(不推荐)
    queue.offer("a");
    queue.offer("b");
    queue.offer("c");
    queue.offer("d");
    queue.offer("e");
    queue.add("f");
    //在队列元素为空的情况下,remove() 方法会抛出NoSuchElementException异常,poll() 方法只会返回 null 。
    String first2 = queue.remove();//返回第一个元素,删除
    System.out.println(first2);//a
    String first1 = queue.poll();//返回第一个元素,删除
    System.out.println(first1);//b
    String first = queue.peek();//返回第一个元素,但不删除
    System.out.println(first);//c
    System.out.println(queue);//[c, d, e, f]
    first = queue.element();//返回第一个元素
    System.out.println(first);//c
}

2、deque

双向队列是指该队列两端的元素既能入队(offer)也能出队(poll),如果将Deque限制为只能从一端入队和出队,则可实现栈的数据结构。对于栈而言,有入栈(push)和出栈(pop),遵循先进后出原则。

初始化:

Deque<Integer> d = new LinkedList<Integer>();

常用方法:

**addLast(E e)😗*在队列尾部插入元素.

**offerLast(E e)😗*在队列尾部插入元素。

**removeFirst()😗*获取头部元素。

**pollFirst()😗*获取头部元素。

**getFirst()😗*获取头部元素。

**peekFirst()😗*获取头部元素。

//上述方法均和queue中方法一一对应。
//且queue中的方法,deque中均可用。

**getLast()😗*获取但不移除队列最后一个元素。

**offerFirst()😗*将指定元素插入队列开头。

**peekLast()😗*获取但不移除双端队列最后一个元素。

**pollLast()😗*获取并移除双端队列最后一个元素。

**pop()😗*从双端队列表示的堆栈 中弹出一个元素。

**push()😗*将一个元素推入双端队列表示的堆栈,即队列的头部。成功返回true,如果没有可用空间,抛出IllegalStateException。

**removeLast()😗*获取并移除移除双端队列最后一个元素。

**size()😗*返回双端队列元素数。

**isEmpty()😗*判断队列是否为空,为空返回true。

**remove(Object o)😗*从双端队列中移除第一次出现的指定元素。

实例代码:

public static void test02(){
    Deque<String> deque = new LinkedList<>();
    deque.offer("a");
    deque.offer("b");
    deque.offerFirst("c");//在队列头部进行插入
    System.out.println(deque);//[c, a, b]
    deque.offerLast("d");
    System.out.println(deque);//[c, a, b, d]

    String ret = deque.element();//返回第一个元素
    System.out.println(ret);//c

    ret = deque.getFirst();//返回第一个元素
    System.out.println(ret);//c
    ret = deque.getLast();//返回最后一个元素
    System.out.println(ret);//d

    ret = deque.peek();//返回第一个元素,但不删除
    System.out.println(ret);//c

    ret = deque.peekFirst();//返回第一个元素,但不删除
    System.out.println(ret);//c
    ret = deque.peekLast();//返回最后一个元素,但不删除
    System.out.println(ret);//d

    System.out.println(deque);

    ret = deque.poll();//返回第一个元素,删除
    System.out.println(ret);//c
    System.out.println(deque);//[a, b, d]

    ret = deque.pop();//返回第一个元素,删除
    System.out.println(ret);//a
    System.out.println(deque);//[b, d]

    deque.clear();
    ret = deque.pop();//抛异常
    System.out.println("11111");
    ret = deque.poll();//返回null,但不抛异常
    System.out.println("++"+ret);
    System.out.println("22222");
}

总结

到此这篇关于Java中队列Queue和Deque区别的文章就介绍到这了,更多相关Java队列Queue和Deque区别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java容器类源码详解 Deque与ArrayDeque

    前言 Queue 也是 Java 集合框架中定义的一种接口,直接继承自 Collection 接口.除了基本的 Collection 接口规定测操作外,Queue 接口还定义一组针对队列的特殊操作.通常来说,Queue 是按照先进先出(FIFO)的方式来管理其中的元素的,但是优先队列是一个例外. Deque 接口继承自 Queue接口,但 Deque 支持同时从两端添加或移除元素,因此又被成为双端队列.鉴于此,Deque 接口的实现可以被当作 FIFO队列使用,也可以当作LIFO队列(栈)来使用

  • java中queue接口的使用详解

    Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Queue接口.Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用.BlockingQueue 继承了Queue接口. 队列是一种数据结构.它有两个基本操作:在队列尾部加人一个元素,和从队列头部移除一个元素就是

  • Java 队列 Queue 用法实例详解

    队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. 以下实例演示了队列(Queue)的用法: /* author by w3cschool.cc Main.java */ import java.util.LinkedList; import java.util.Queue; public class Main { public static void main(S

  • Java使用Deque实现堆栈的方法

    本文实例讲述了Java使用Deque实现堆栈的方法.分享给大家供大家参考.具体如下: import java.util.ArrayDeque; import java.util.Deque; public class IntegerStack { private Deque<Integer> data = new ArrayDeque<Integer>(); public void push(Integer element) { data.addFirst(element); }

  • Java中队列Queue和Deque的区别与代码实例

    目录 一.Queue和Deque 二.api对比 三.代码实例 1.queue 2.deque 总结 一.Queue和Deque Queue以及Deque都是继承于Collection,Deque是Queue的子接口. Queue是FIFO的单向队列,Deque是双向队列. Queue有一个直接子类PriorityQueue,而Deque中直接子类有两个:LinkedList以及ArrayDeque. PriorityQueue的底层数据结构是数组,而无边界的形容,那么指明了PriorityQu

  • Java 中的vector和list的区别和使用实例详解

    要了解vector,list,deque.我们先来了解一下STL. STL是Standard Template Library的简称,中文名是标准模板库.从根本上说,STL是一些容器和算法的集合.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adapters).算法(algorithms).仿函数(functors)六个部分.指针被封装成迭代器,这里vector,list就是所谓的容器. 我们常常在实现链表,栈,队列或者数组时,

  • java中的前++和后++的区别示例代码详解

    java中的前加加++和后加加++,有很多人搞的很晕,不太明白!今天我举几个例子说明下前++和后++的区别! 其实大家只要记住一句话就可以了,前++是先自加再使用而后++是先使用再自加! 前++和后++总结:其实大家只要记住一句话就可以了,前++是先自加再使用而后++是先使用再自加! 请大家看下面的例子就明白了! public class Test { public static void main(String[] args) { //测试,前加加和后加加 //前++和后++总结:其实大家只要

  • 浅谈Java中的Queue家族

    Queue接口 先看下Queue的继承关系和其中定义的方法: Queue继承自Collection,Collection继承自Iterable. Queue有三类主要的方法,我们用个表格来看一下他们的区别: 方法类型 方法名称 方法名称 区别 Insert add offer 两个方法都表示向Queue中添加某个元素,不同之处在于添加失败的情况,add只会返回true,如果添加失败,会抛出异常.offer在添加失败的时候会返回false.所以对那些有固定长度的Queue,优先使用offer方法.

  • java中并发Queue种类与各自API特点以及使用场景说明

    一 先说下队列 队列是一种数据结构.它有两个基本操作:在队列尾部加入一个元素,和从队列头部移除一个元素(注意不要弄混队列的头部和尾部) 就是说,队列以一种先进先出的方式管理数据,如果你试图向一个 已经满了的阻塞队列中添加一个元素或者是从一个空的阻塞队列中移除一个元索,将导致线程阻塞. 在多线程进行合作时,阻塞队列是很有用的工具.工作者线程可以定期地把中间结果存到阻塞队列中而其他工作者线程把中间结果取出并在将来修改它们.队列会自动平衡负载. 如果第一个线程集运行得比第二个慢,则第二个 线程集在等待

  • Java中for(;;)和while(true)的区别

    目录 1.问题来源 2.比较 2.1 测试代码for 2.2 测试代码while 3.结论 1.问题来源 在阅读Java的JDK源码时,发现大部分写源码的大佬多采用for(;;)的方式来死循环,比如说AQS(AbstractQueuedSynchronizer)中大量使用的自旋的方式获取共享状态. /** * 通过"死循环"的方式来正确的添加节点 */ private Node enq(final Node node) { // 不断循环,直至CAS插入节点成功 for (;;) {

  • java实现队列queue数据结构详解

    目录 概念 队列中两个主要操作 队列遵循以下条件: 队列的数组实现 总结 概念 队列是一种非原始(特殊)的线性表,是一种先进先出(FIFO)的数据结构.它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作. FIFO:first input first output,即先添加的元素,先移除,最后添加的元素,最后移除. 工作方式类似于商场排队结账情形: 数组模拟队列图示: 队列中两个主要操作 插入值操作:insert ——> enqueue(入队) ——>参数是要插

  • C++中队列queue的用法实例详解

    目录 一.定义 一.queue初始化 二.queue常用函数 补充:queue 的基本操作举例如下 总结 一.定义 queue是一种容器转换器模板,调用#include< queue>即可使用队列类. 一.queue初始化 queue<Type, Container> (<数据类型,容器类型>) 初始化时必须要有数据类型,容器可省略,省略时则默认为deque 类型 初始化示例 1: queue<int>q1; queue<double>q2; q

  • 浅谈Java中static和非static的区别

    关于static和非static变量的区别 1. static 修饰的变量称为类变量或全局变量或成员变量,在类被加载的时候成员变量即被初始化,与类关联,只要类存在,static变量就存在.非static修饰的成员变量是在对象new出来的时候划分存储空间,是与具体的对象绑定的,该成员变量仅为当前对象所拥有的. 2. static修饰的变量在加载的时候先于main方法加载在内存中的数据共享区-------方法区,而非static的变量在加载的时候,是要创建变量才加载在堆内存中的. 3. 一个stat

  • 详解Java中字符流与字节流的区别

    本文为大家分析了Java中字符流与字节流的区别,供大家参考,具体内容如下 1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可以从中读入一个字节序列的对象被称为输入流:能够向其写入一个字节序列的对象被称为输出流. 2. 字节流 Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据.Java中最基本的两个字节流类是InputStream和Out

随机推荐