欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

在Java中,deque和queue的区别与应用

最编程 2024-07-25 22:50:38
...


队列(queue)简述

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

在处理元素前用于保存元素的 collection。除了基本的  Collection 操作外,队列还提供其他的插入、提取和检查操作。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是用于专门为有容量限制的 Queue

 

 

抛出异常

返回特殊值

插入

 add(e)

 offer(e)

移除

 remove()

 poll()

检查

 element()

 peek()

队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。无论使用哪种排序方式,队列的 都是调用  remove() 或  poll() 所移除的元素。在 FIFO 队列中,所有的新元素都插入队列的末尾。其他种类的队列可能使用不同的元素放置规则。每个 Queue

Queue 接口并未定义阻塞队列的方法,而这在并发编程中是很常见的。 BlockingQueue 接口定义了那些等待元素出现或等待队列中有可用空间的方法,这些方法扩展了此接口。

Queue 实现通常不允许插入 null 元素,尽管某些实现(如  LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中,因为 null 也用作 poll

Queue 实现通常未定义 equals 和 hashCode 方法的基于元素的版本,而是从 Object

java中deque与queque java deque queue_双端队列

 

Queue常用方法:

  1. boolean add(E e);将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。
  2. boolean offer(E e);将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于  add(E),后者可能无法插入元素,而只是抛出一个异常。
  3. E remove();获取并移除此队列的头。
  4. E poll();获取并移除此队列的头,如果此队列为空,则返回 null。
  5. E element();获取,但是不移除此队列的头。
  6. E peek();获取但不移除此队列的头;如果此队列为空,则返回 null。

双端队列(Deque)简述

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

一个线性 collection,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。大多数 Deque

此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是专为使用有容量限制的 Deque

下表总结了上述 12 种方法:

 

 

第一个元素(头部)

最后一个元素(尾部)

 

抛出异常

特殊值

抛出异常

特殊值

插入

 addFirst(e)

 offerFirst(e)

 addLast(e)

 offerLast(e)

移除

 removeFirst()

 pollFirst()

 removeLast()

 pollLast()

检查

 getFirst()

 peekFirst()

 getLast()

 peekLast()

此接口扩展了  Queue 接口。在将双端队列用作队列时,将得到 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从 Queue 接口继承的方法完全等效于 Deque

此接口扩展了  Queue 接口。在将双端队列用作队列时,将得到 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从 Queue 接口继承的方法完全等效于 Deque

 

Queue

等效 Deque

 add(e)

 addLast(e)

 offer(e)

 offerLast(e)

 remove()

 removeFirst()

 poll()

 pollFirst()

 element()

 getFirst()

 peek()

 peekFirst()

双端队列也可用作 LIFO(后进先出)堆栈。应优先使用此接口而不是遗留  Stack 类。在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。堆栈方法完全等效于 Deque

 

堆栈方法

等效 Deque

 push(e)

 addFirst(e)

 pop()

 removeFirst()

 peek()

 peekFirst()

注意,在将双端队列用作队列或堆栈时, peek 方法同样正常工作;无论哪种情况下,都从双端队列的开头抽取元素。

此接口提供了两种移除内部元素的方法: removeFirstOccurrence 和  removeLastOccurrence

与  List 接口不同,此接口不支持通过索引访问元素。

虽然 Deque 实现没有严格要求禁止插入 null 元素,但建议最好这样做。建议任何事实上允许 null 元素的 Deque 实现用户最好 要利用插入 null 的功能。这是因为各种方法会将 null

Deque 实现通常不定义基于元素的 equals 和 hashCode 方法,而是从 Object 类继承基于身份的 equals 和 hashCode



从以下版本开始:

1.6


 

方法摘要

 boolean

add(E 

          将指定元素插入此双端队列所表示的队列(换句话说,此双端队列的尾部),如果可以直接这样做而不违反容量限制的话;如果成功,则返回 true,如果当前没有可用空间,则抛出 IllegalStateException。

 void

addFirst(E 

          将指定元素插入此双端队列的开头(如果可以直接这样做而不违反容量限制)。

 void

addLast(E 

          将指定元素插入此双端队列的末尾(如果可以直接这样做而不违反容量限制)。

 boolean

contains(Object 

          如果此双端队列包含指定元素,则返回 true。

 Iterator<E>

descendingIterator() 

          返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。

 E

element() 

          获取,但不移除此双端队列所表示的队列的头部(换句话说,此双端队列的第一个元素)。

 E

getFirst() 

          获取,但不移除此双端队列的第一个元素。

 E

getLast() 

          获取,但不移除此双端队列的最后一个元素。

 Iterator<E>

iterator() 

          返回以恰当顺序在此双端队列的元素上进行迭代的迭代器。

 boolean

offer(E 

          将指定元素插入此双端队列所表示的队列(换句话说,此双端队列的尾部),如果可以直接这样做而不违反容量限制的话;如果成功,则返回 true,如果当前没有可用的空间,则返回 false。

 boolean

offerFirst(E 

          在不违反容量限制的情况下,将指定的元素插入此双端队列的开头。

 boolean

offerLast(E 

          在不违反容量限制的情况下,将指定的元素插入此双端队列的末尾。

 E

peek() 

          获取,但不移除此双端队列所表示的队列的头部(换句话说,此双端队列的第一个元素);如果此双端队列为空,则返回 null。

 E

peekFirst() 

          获取,但不移除此双端队列的第一个元素;如果此双端队列为空,则返回 null。

 E

peekLast() 

          获取,但不移除此双端队列的最后一个元素;如果此双端队列为空,则返回 null。

 E

poll() 

          获取并移除此双端队列所表示的队列的头部(换句话说,此双端队列的第一个元素);如果此双端队列为空,则返回 null。

 E

pollFirst() 

          获取并移除此双端队列的第一个元素;如果此双端队列为空,则返回 null。

 E

pollLast() 

          获取并移除此双端队列的最后一个元素;如果此双端队列为空,则返回 null。

 E

pop() 

          从此双端队列所表示的堆栈中弹出一个元素。

 void

push(E 

          将一个元素推入此双端队列所表示的堆栈(换句话说,此双端队列的头部),如果可以直接这样做而不违反容量限制的话;如果成功,则返回 true,如果当前没有可用空间,则抛出 IllegalStateException。

 E

remove() 

          获取并移除此双端队列所表示的队列的头部(换句话说,此双端队列的第一个元素)。

 boolean

remove(Object 

          从此双端队列中移除第一次出现的指定元素。

 E

removeFirst() 

          获取并移除此双端队列第一个元素。

 boolean

removeFirstOccurrence(Object 

          从此双端队列移除第一次出现的指定元素。

 E

removeLast() 

          获取并移除此双端队列的最后一个元素。

 boolean

removeLastOccurrence(Object 

          从此双端队列移除最后一次出现的指定元素。

 int

size() 

          返回此双端队列的元素数。

 

推荐阅读