什么是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集合的更多相关文章

  1. 【java提高】---queue集合

    queue集合 什么是Queue集合? 答:Queue用于模拟队列这种数据结构.队列通常是指“先进先出(FIFO)”的容器.队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素. 新元 ...

  2. Stack集合、queue集合、hashtable集合

    1.栈:Stack,先进后出,一个一个赋值,一个一个取值,按顺序. .count           取集合内元素的个数 .push()         将元素一个一个推入集合中//stack集合存入 ...

  3. (1)List集合 (2)Queue集合 (3)Set集合

    1.List集合(重中之重)1.1 基本概念 java.util.List接口是Collection接口的子接口,该接口中元素有先后放入次序并允许重复 该接口的主要实现类:ArrayList类.Lin ...

  4. 集合、ArrayList 集合。Stack集合。Queue集合。以及Hashtable集合

    arrayList 首先复制Colections加  : 创建arrayList ar =new arrayList(); //ArrayList al=new ArrayList();        ...

  5. Java——(六)Collection之Queue集合

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Queue集合 Queue集合用于模拟队列这种数据结构,队列通常是指“先进先出‘(FIFO)的容 ...

  6. Java集合类学习笔记(Queue集合)

    Queue集合用于模拟队列(先进先出:FIFO)这种数据类型. Queue有一个Deque接口,代表一个"双端队列",双端队列可以同时从两端来添加.删除元素,因此Deque的实现类 ...

  7. Java多线程系列--“JUC集合”07之 ArrayBlockingQueue

    概要 本章对Java.util.concurrent包中的ArrayBlockingQueue类进行详细的介绍.内容包括:ArrayBlockingQueue介绍ArrayBlockingQueue原 ...

  8. Java多线程系列--“JUC集合”08之 LinkedBlockingQueue

    概要 本章介绍JUC包中的LinkedBlockingQueue.内容包括:LinkedBlockingQueue介绍LinkedBlockingQueue原理和数据结构LinkedBlockingQ ...

  9. Java多线程系列--“JUC集合”09之 LinkedBlockingDeque

    概要 本章介绍JUC包中的LinkedBlockingDeque.内容包括:LinkedBlockingDeque介绍LinkedBlockingDeque原理和数据结构LinkedBlockingD ...

随机推荐

  1. jQuery+Ajax滚屏异步加载数据实现(附源码)

    一.CSS样式 body { font:12px/1.0em Microsoft Yahei; line-height:1.6em; background:#fff; line-height:1.2e ...

  2. [Node.js] Node + Redis 实现分布式Session方案

    原文地址: http://www.moye.me/?p=565 Session是什么? Session 是面向连接的状态信息,是对 Http 无状态协议的补充. Session 怎么工作? Sessi ...

  3. C#语法糖之 session操作类 asp.net

    用法: //声名一个数据集合 var listString = new List<string>() { "a", "b", "c&quo ...

  4. AEAI EM费用管理系统V1.0.2版本开源发布

    本次开源发布是AEAI EM费用管理系统 V1.0.2版,该版本是此产品的首个版本,产品现已开源并上传至开源社区http://www.oschina.net/p/aeai-em. 产品说明: AEAI ...

  5. (二)Protobuf的C#使用

    [转]http://blog.csdn.net/shantsc/article/details/50729402 protobuf  c#版本分成两个版本,一个是protobuf-net,另一个是pr ...

  6. Python打包-py2exe使用

    Py2exe 64位下载地址:http://download.csdn.net/detail/henujyj/8532827 Py2exe 32位下载地址:https://sourceforge.ne ...

  7. WPF,给颜色SolidColorBrush添加动画

    /// <summary> /// 设置颜色动画 /// </summary> /// <returns></returns> private Soli ...

  8. Little Jumper---(三分)

    Description Little frog Georgie likes to jump. Recently he have discovered the new playground that s ...

  9. 那些教程没有的php2-对象

    php.net 对象 在类定义内部,可以用 new self 和 new parent 创建新对象. 当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样.可以用克 ...

  10. javascript实现排序算法

    准备好好学习js了,js写的第一个排序 先推荐一个js在线编辑工具,RunJS,还不错. 冒泡排序 var arr = [2,4,1,5,3]; function handle(arr){ for(v ...