java(34):数据结构(4)--Queue(1)概念基础

本文详细介绍了 Java 中 Queue 接口的基本概念及其主要方法,包括 add、element、offer、peek、poll 和 remove 的功能及使用场景。同时,通过一个简单的示例程序展示了如何使用 LinkedList 实现队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日期:2017/11/30

     Queue


java.util 
接口 Queue<E>

类型参数:
E - collection 中所保存元素的类型。
所有超级接口:
Collection<E>,  Iterable<E>
所有已知子接口:
BlockingDeque<E>,  BlockingQueue<E>,  Deque<E>
所有已知实现类:
AbstractQueueArrayBlockingQueueArrayDequeConcurrentLinkedQueueDelayQueueLinkedBlockingDequeLinkedBlockingQueueLinkedList,  PriorityBlockingQueuePriorityQueueSynchronousQueue

public interface Queue<E>
   
    extends 
    Collection<E>
   

一、队列的特性是什么呢?


      先进先出,意味着数据元是有序的;LinkedList 恰好可以实现这一点,LinkedList 提供了方法以支持队列的行为,同时实现了Queue接口,因此LinkedList 可以作为Queue的一种实现。提供将LinkedList  向上转型为Queue。


二、那么Queue提供了哪些方法呢?方法有哪些特点?


方法摘要
 booleanadd(E e) 
          将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException
 Eelement() 
          获取,但是不移除此队列的头。
 booleanoffer(E e) 
          将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。
 Epeek() 
          获取但不移除此队列的头;如果此队列为空,则返回 null
 Epoll() 
          获取并移除此队列的头,如果此队列为空,则返回 null
 Eremove() 
          获取并移除此队列的头。
 
从接口 java.util.Collection 继承的方法
addAllclearcontainscontainsAllequalshashCodeisEmptyiteratorremoveremoveAllretainAllsizetoArraytoArray

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

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

     如果可能,offer 方法可插入一个元素,否则返回 false。这与 Collection.add 方法不同,该方法只能通过抛出未经检查的异常使添加元素失败。offer 方法设计用于正常的失败情况,而不是出现异常的情况,例如在容量固定(有界)的队列中。

  remove() 和 poll() 方法可移除和返回队列的头。到底从队列中移除哪个元素是队列排序策略的功能,而该策略在各种实现中是不同的。remove() 和 poll() 方法仅在队列为空时其行为有所不同:remove() 方法抛出一个异常,而 poll() 方法则返回 null

     element() 和 peek() 返回,但不移除,队列的头。

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

     Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中,因为 null 也用作 poll 方法的一个特殊返回值,表明队列不包含元素。

     Queue 实现通常未定义 equals 和 hashCode 方法的基于元素的版本,而是从 Object 类继承了基于身份的版本,因为对于具有相同元素但有不同排序属性的队列而言,基于元素的相等性并非总是定义良好的。


三、例子代码


package PrepareTest;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;

public class test10_QueueDemo {
	public static void printQ(Queue queue){
		while(queue.peek() != null){
//			System.out.print(queue.remove());
			System.out.print(queue.poll());
		}
		System.out.println();
	}
	public static void main(String[] args) {
		//不能实例化类型 Queue<Integer>
//		Queue<Integer> queue = new Queue<Integer>();
		Queue<Integer> queue = new LinkedList<Integer>();
		Random rand = new Random(80);
		for(int i = 0; i < 10; i++){
			queue.offer(rand.nextInt(i + 10));
		}
		printQ(queue);
		Queue<Character> qc = new LinkedList<Character>();
		for(char c : "Brontosaurus".toCharArray()){
			qc.offer(c);
		}
		printQ(qc);
	}

}

输出结果:

692313317111
Brontosaurus


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值