Java集合 之 Queue集合
什么是Queue集合?
答:Queue用于模拟队列这种数据结构。队列通常是指“先进先出(FIFO)”的容器。队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素。新元素插入到队列的尾部,取出元素会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。
Queue接口中定义了如下的几个方法:
void add(Object e): 将指定元素插入到队列的尾部。
object element(): 获取队列头部的元素,但是不删除该元素。
boolean offer(Object e): 将指定的元素插入此队列的尾部。当使用容量有限的队列时,此方法通常比add(Object e)有效。
Object peek(): 返回队列头部的元素,但是不删除该元素。如果队列为空,则返回null。
Object poll(): 返回队列头部的元素,并删除该元素。如果队列为空,则返回null。
Object remove(): 获取队列头部的元素,并删除该元素。
Queue接口有一个PriorityQueue实现类。除此之外,Queue还有一个Deque接口,Deque代表一个“双端队列”,双端队列可以同时从两端删除或添加元素,因此Deque可以当作栈来使用。java为Deque提供了ArrayDeque实现类和LinkedList实现类。
1.PriorityQueue实现类
PriorityQueue是一种比较标准的队列实现类,而不是绝对标准的。这是因为PriorityQueue保存队列元素的顺序不是按照元素添加的顺序来保存的,而是在添加元素的时候对元素的大小排序后再保存的。因此在PriorityQueue中使用peek()或pool()取出队列中头部的元素,取出的不是最先添加的元素,而是最小的元素。
public class PriorityQueueTest {
public static void main(String[] args){
PriorityQueue pq = new PriorityQueue();
pq.offer(6);
pq.add(-3);
pq.add(20);
pq.offer(18);
//输出:[-3, 6, 20, 18]
System.out.println(pq);
}
}
PriorityQueue不允许插入null元素,它还需要对队列元素进行排序,PriorityQueue有两种排序方式:
自然排序:采用自然排序的PriorityQueue集合中的元素必须实现Comparator接口,而且应该是一个类的多个实例,否则可能导致ClassCastException异常。
定制排序:创建PriorityQueue队列时,传入一个Comparable对象,该对象负责对所有队列中的所有元素进行排序。采用定制排序不要求必须实现Comparator接口。
2.Dueue接口与ArrayDeque实现类
Deque接口是Queue接口的子接口,它代表一个双端队列,Deque定义了一些方法:
void addFirst(Object e): 将指定元素添加到双端队列的头部。
void addLast(Object e): 将指定元素添加到双端队列的尾部。
Iteratord descendingItrator(): 返回该双端队列对应的迭代器,该迭代器以逆向顺序来迭代队列中的元素。
Object getFirst(): 获取但不删除双端队列的第一个元素。
Object getLast(): 获取但不删除双端队列的最后一个元素。
boolean offFirst(Object e): 将指定元素添加到双端队列的头部。
boolean offLast(OBject e): 将指定元素添加到双端队列的尾部。
Object peekFirst(): 获取但不删除双端队列的第一个元素;如果双端队列为空,则返回null。
Object PeekLast(): 获取但不删除双端队列的最后一个元素;如果双端队列为空,则返回null。
Object pollFirst(): 获取并删除双端队列的第一个元素;如果双端队列为空,则返回null。
Object pollLast(): 获取并删除双端队列的最后一个元素;如果双端队列为空,则返回null。
Object pop()(栈方法): pop出该双端队列所表示的栈的栈顶元素。相当于removeFirst()。
void push(Object e)(栈方法): 将一个元素push进该双端队列所表示的栈的栈顶。相当于addFirst()。
Object removeFirst(): 获取并删除该双端队列的第一个元素。
Object removeFirstOccurence(Object o): 删除该双端队列的第一次出现的元素o。
Object removeLast(): 获取并删除该双端队列的最后一个元素o。
Object removeLastOccurence(Object o): 删除该双端队列的最后一次出现的元素o。
public class ArrayDequeTest {
public static void main(String[] args){
ArrayDeque queue = new ArrayDeque();
queue.offer("春");
queue.offer("夏");
queue.offer("秋");
//输出:[春, 夏, 秋]
System.out.println(queue);
//输出:春
System.out.println(queue.peek());
//输出:[春, 夏, 秋]
System.out.println(queue);
//输出:春
System.out.println(queue.poll());
//输出:[夏, 秋]
System.out.println(queue); }
}
//将双端队列当做栈
public class DequeStack {
public static void main(String[] args){
ArrayDeque stack = new ArrayDeque();
stack.push("春");
stack.push("夏");
stack.push("秋");
//输出:[秋, 夏, 春]
System.out.println(stack);
//输出:秋
System.out.println(stack.peek());
//输出:[秋, 夏, 春]
System.out.println(stack);
//输出:秋
System.out.println(stack.pop());
//输出:[夏, 春]
System.out.println(stack);
}
}
3.LinkedList实现类
LinkedList是List接口的实现类,因此它可以是一个集合,可以根据索引来随机访问集合中的元素。此外,它还是Duque接口的实现类,因此也可以作为一个双端队列,或者栈来使用。
LinkedList与ArrayList,ArrayDeque的实现机制完全不同,ArrayList和ArrayDeque内部以数组的形式来保存集合中的元素,因此随机访问集合元素时有较好的性能;而LinkedList以链表的形式来保存集合中的元素,因此随机访问集合元素时性能较差,但是插入和删除元素时性能比较出色(只需改变指针所指的地址即可),需要指出的是,虽然Vector也是以数组的形式来存储集合但因为它实现了线程同步(而且实现的机制不好),故各方面的性能都比较差。
Java集合 之 Queue集合的更多相关文章
- 【java提高】---queue集合
queue集合 什么是Queue集合? 答:Queue用于模拟队列这种数据结构.队列通常是指“先进先出(FIFO)”的容器.队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素. 新元 ...
- Stack集合、queue集合、hashtable集合
1.栈:Stack,先进后出,一个一个赋值,一个一个取值,按顺序. .count 取集合内元素的个数 .push() 将元素一个一个推入集合中//stack集合存入 ...
- (1)List集合 (2)Queue集合 (3)Set集合
1.List集合(重中之重)1.1 基本概念 java.util.List接口是Collection接口的子接口,该接口中元素有先后放入次序并允许重复 该接口的主要实现类:ArrayList类.Lin ...
- 集合、ArrayList 集合。Stack集合。Queue集合。以及Hashtable集合
arrayList 首先复制Colections加 : 创建arrayList ar =new arrayList(); //ArrayList al=new ArrayList(); ...
- Java——(六)Collection之Queue集合
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Queue集合 Queue集合用于模拟队列这种数据结构,队列通常是指“先进先出‘(FIFO)的容 ...
- Java集合类学习笔记(Queue集合)
Queue集合用于模拟队列(先进先出:FIFO)这种数据类型. Queue有一个Deque接口,代表一个"双端队列",双端队列可以同时从两端来添加.删除元素,因此Deque的实现类 ...
- Java多线程系列--“JUC集合”07之 ArrayBlockingQueue
概要 本章对Java.util.concurrent包中的ArrayBlockingQueue类进行详细的介绍.内容包括:ArrayBlockingQueue介绍ArrayBlockingQueue原 ...
- Java多线程系列--“JUC集合”08之 LinkedBlockingQueue
概要 本章介绍JUC包中的LinkedBlockingQueue.内容包括:LinkedBlockingQueue介绍LinkedBlockingQueue原理和数据结构LinkedBlockingQ ...
- Java多线程系列--“JUC集合”09之 LinkedBlockingDeque
概要 本章介绍JUC包中的LinkedBlockingDeque.内容包括:LinkedBlockingDeque介绍LinkedBlockingDeque原理和数据结构LinkedBlockingD ...
随机推荐
- Java定位CPU使用高问题--转载
原文地址:http://www.cnblogs.com/guoyuqiangf8/p/3545687.html 1.TOP命令,查询消耗CPU高的进程号 PID,并记录下来,按下键盘"H&q ...
- Java 常用字符串操作总结
1. String转ASCII码 public static String stringToAscii(String value) { StringBuffer sbu = new StringBuf ...
- css-盒子模型
css-盒子模型 一.padding(内边距) 元素的内边距在边框和内容区之间.控制该区域最简单的属性是 padding 属性.CSS padding 属性定义元素边框与元素内容之间的空白区域. ...
- xss-跨站脚本攻击-后台传给前端的html标签安全显示
作用 后台拼接的html字符串传到前端,默认是不安全的,需要告诉前端这个字符串是安全的,可以正常显示html标签. 知识点 1.定义 2 3 <script> 获取session ...
- C#入门经典第五版之变量与表达式编码题训练
问题:编写一个控制台应用程序,要求用户输入4个int值,并显示它们的乘积.提示:可以使用Convert.ToDouble()命令,把用户在控制台上输入的数转换为double, 以此类推,转换成int命 ...
- JavaScript 按值传递 & 按引用传递
(1)值的比较--引用的比较 首先,原始值的比较是值的比较:只有在它们值相等的时候它们才相等 比如简单的 var a1 = 10; var a2 = 10; console.log(a1 === a2 ...
- [Perl]抓取个人的所有闪存+格式化保存为文本
以下代码保存为utf8文本格式 环境:ActivePerl v5.16 built for MSWin32-x86 两个要调整的地方: for my $i (17..45) { 这里改成自己对应的页 ...
- DFS --- HNU 13307 Galaxy collision
Galaxy collision Problem's Link Mean: 给定二维坐标平面内的n个整数点,让你把这n个点划分为两个集合,同一集合内的所有点必须两两距离大于5,求这两个集合的元素个数之 ...
- 利用Aspose.Cell控件导入Excel非强类型的数据
导入Excel的操作是非常常见的操作,可以使用Aspose.Cell.APOI.MyXls.OLEDB.Excel VBA等操作Excel文件,从而实现数据的导入,在导入数据的时候,如果是强类型的数据 ...
- C#检查标准图幅编号
/// <summary> /// 检查是否为标准图幅编号 /// </summary> /// <param name="MapNumber"> ...