接上篇“java集合类(五)About Map”

终于来到了java集合类的尾声,太兴奋了,不是因为可以休息一阵了,而是因为又到了开启新知识的时刻,大家一起加油打气!!Come on...Fighting!

  • About “interface Queue<E>”
All Superinterfaces:Collection<E>, Iterable<E>
All Known Subinterfaces:BlockingDeque<E>, BlockingQueue<E>, Deque<E>, TransferQueue<E>
All Known Implementing Classes:AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList, LinkedTransferQueue, PriorityBlockingQueue, PriorityQueue, SynchronousQueue
先简要说明下队列:
      之前,在“java集合类(三)About Iterator & Vector(Stack)”中讲到堆(heap)与栈(stack)的区别,现在讨论栈Stack与队列Queue的区别:
1)队列:FIFO先进先出,栈LIFO后进先出
2)队列:从队尾进对头出,栈:栈顶进栈顶出
3)遍历的速度不同:栈只能从栈顶取数,要得到最先入栈的元素,必须遍历这个栈,而且还需要开辟临时空间;队列则不同,它基于指针进行遍历,可以从对头或者队尾开始(不能同时),无需临时空间,遍历过程不影响数据结构,速度要快得多
  • Queue的实现:在学习LinkedList的时候,我们已知道LinkedList实现了Queue接口,所以今天的Queue也可以用LinkedList实现,并且LinkedList还实现了Stack(java集合类(三)About Iterator & Vector(Stack)提到),所以我们也可以设想能不能用Stack实现Queue?答案是肯定的, 不过要用两个Stack才能实现! 现在来看一个Queue的基础例子:
  1. import java.util.LinkedList;
  2. import java.util.Queue;
  3. import java.util.Random;
  4.  
  5. /**
  6. * @author jp
  7. *@date 2013-12-16
  8. */
  9. public class queuedemo {
  10. public static void printqueue(Queue queue) {
  11. while (queue.peek() != null) {
  12. System.out.print(queue.remove() + " ");
  13. }
  14. System.out.println();
  15. }
  16. public static void main(String[] args) {
  17. Queue<Integer> queue = new LinkedList<Integer>();
  18. Random random = new Random(32);
  19. for (int i = 0; i < 10; i++)
  20. queue.offer(random.nextInt(i + 10));
  21. printqueue(queue);
  22. Queue<Character> qCharacters = new LinkedList<Character>();
  23. for(char c: "GreatUniversity".toCharArray())
  24. qCharacters.offer(c);
  25. printqueue(qCharacters);
  26. }
  27. }

Output:

7 7 5 9 9 2 9 3 0 2
G r e a t U n i v e r s i t y

说明:关于Queue的操作

  Throws exception Returns special value
Insert add(e) offer(e)
Remove remove() poll()
Examine element() peek()

add()& offer():在队尾插入元素,成功则返回true,失败则返回false,并且可能会会抛出IllegalStateException等;但offer()不会抛出任何异常;

remove()& poll():移除并返回对头元素,但在队列为空时,pull()返回null,而remove()则抛出NoSuchElementException;

element() & peek():不移除并返回对头元素,但在队列为空时,peek()返回null,而element()则抛出NoSuchElementException;

  • About PriorityQueue:PriorityQueue与Queue的最基本的区别在于,优先级队列PriorityQueue具有顺序性;通常PriorityQueue用offer()方法进行插入元素的时候,它的默认顺序是对象的自然顺序(数字小到大,字母按字母表),但程序员可以通过提供自己的Comparator修改默认排序,以确保在通过peek(),poll(),remove()等方法获取元素时,得到的是具有最高优先级的的元素。另外,在学习数据结构堆排序的时候,老师跟我们讲得一般都是基于大顶堆而不是小顶堆,因为一般小顶堆通常用来实现维持优先级队列。下面举例说明:
  1. import java.util.Arrays;
  2. import java.util.Collections;
  3. import java.util.HashSet;
  4. import java.util.PriorityQueue;
  5. import java.util.Queue;
  6. import java.util.Random;
  7. import java.util.Set;
  8.  
  9. /**
  10. * @author jp
  11. *@date 2013-12-16
  12. */
  13. public class priorityqueuedemo {
  14. public static void printqueue(Queue queue) {
  15. while (queue.peek() != null) {
  16. System.out.print(queue.remove() + " ");
  17. }
  18. System.out.println();
  19. }
  20. public static void main(String[] args) {
  21. PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>();
  22. Random random = new Random(32);
  23. for(int i = 0;i < 10; i++)
  24. priorityQueue.offer(random.nextInt(i + 10));
  25. printqueue(priorityQueue);
  26. java.util.List<Integer> list = Arrays.asList(12,14,15,16,17,18,19,20);
  27. priorityQueue = new PriorityQueue<Integer>(list);
  28. printqueue(priorityQueue);
  29. priorityQueue = new PriorityQueue<Integer>(list.size(), Collections.reverseOrder());
  30. priorityQueue.addAll(list);
  31. printqueue(priorityQueue);
  32.  
  33. String string = "i have a great dream";
  34. Set<Character> charset = new HashSet<Character>();
  35. for (char c: string.toCharArray()) {
  36. charset.add(c);
  37. }
  38. PriorityQueue<Character> pCharacters = new PriorityQueue<Character>(charset);
  39. printqueue(pCharacters);
  40. }
  41. }

Output:

从最后一行可以看出:空格的优先级比一般的字母要高。下面看一个关于自己定义顺序,修改Comparator的例子:

  1. import java.util.*;
  2.  
  3. class ToDoList extends PriorityQueue<ToDoList.ToDoItem> {
  4.  
  5. static class ToDoItem implements Comparable<ToDoItem> {
  6. private char primary;
  7. private int secondary;
  8. private String item;
  9.  
  10. public ToDoItem(String s, char c, int i) {
  11. primary = c;
  12. secondary = i;
  13. item = s;
  14. }
  15.  
  16. /*
  17. * @see java.lang.Comparable#compareTo(java.lang.Object)
  18. * @implements Comparabale,then define the CompareTo()
  19. * @function firstly compare "key value",then "secondary value"(+1,0,-1)
  20. */
  21. public int compareTo(ToDoItem arg) {
  22. if(primary > arg.primary)
  23. return +1;
  24. if(primary == arg.primary)
  25. if(secondary > arg.secondary)
  26. return +1;
  27. else if(secondary == arg.secondary)
  28. return 0;
  29. return -1;
  30. }
  31.  
  32. public String toString() {
  33. return Character.toString(primary) + secondary +": " + item;
  34. }
  35. }
  36.  
  37. public void add(String s, char c, int i) {
  38. super.add(new ToDoItem(s, c, i));
  39. }
  40.  
  41. public static void main(String[] args) {
  42. ToDoList toDoList = new ToDoList();
  43. toDoList.add("allen",'a',2);
  44. toDoList.add("jackson",'a',3);
  45. toDoList.add("davil",'b',3);
  46. toDoList.add("avily",'b',2);
  47. while (!toDoList.isEmpty()) {
  48. System.out.println(toDoList.remove());
  49. }
  50. }
  51. }

output:

a2: allen
a3: jackson
b2: avily
b3: davil

除了一般的Queue和PriorityQueue,还有一种叫做双端队列Deque,但它相对没那么常用,在此就不做相关介绍了,有兴趣的读者可以自行学习!

  

java集合类(六)About Queue的更多相关文章

  1. java集合类深入分析之Queue篇

    简介 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约.实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现 ...

  2. java集合类深入分析之Queue篇(Q,DQ)

    简介 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约.实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现 ...

  3. 基础知识《六》---Java集合类: Set、List、Map、Queue使用场景梳理

    本文转载自LittleHann 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E6%8E%92%E5%BA%8F% ...

  4. Java集合类: Set、List、Map、Queue使用场景梳理

    本文主要关注Java编程中涉及到的各种集合类,以及它们的使用场景 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E ...

  5. Java集合类: Set、List、Map、Queue使用

    目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的 ...

  6. Java集合类: Set、List、Map、Queue使用场景

    目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的 ...

  7. Java集合类——Set、List、Map、Queue接口

    目录 Java 集合类的基本概念 Java 集合类的层次关系 Java 集合类的应用场景 一. Java集合类的基本概念 在编程中,常需要集中存放多个数据,数组是一个很好的选择,但数组的长度需提前指定 ...

  8. java集合类(五)About Map

    接上篇“java集合类(四)About Set” 这次学完Map之后,就剩队列的知识,之后有关java集合类的学习就将告一段落,之后可能会有java连接数据库,I/O,多线程,网络编程或Android ...

  9. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...

随机推荐

  1. Android中Json数据读取与创建

    一:  Json的特性和在数据交互中的地位就不用说了,直接看案例. 首先在android studio中创建assets文件目录,用于存放Json数据文件,android studio 1.3 默认项 ...

  2. 【学习笔记】【C语言】指针

    一.指针变量的定义 1. 格式:变量类型 *指针变量名; 2. 举例:int *p;   char *p2; 3. 注意:定义变量时的*仅仅是指针变量的象征 二.利用指针变量简单修改其他变量的值 1. ...

  3. C#颜色 转换

    C#Winform 使用16进制颜色 var color = ColorTranslator.FromHtml("#eeeeee");

  4. linux命令后台运行[转]

    有两种方式:    1. command & : 后台运行,你关掉终端会停止运行    2. nohup command & : 后台运行,你关掉终端也会继续运行 一. 简介     ...

  5. (转)每天一个linux命令(46):vmstat命令

    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深 ...

  6. Android开发之切换activity动画overridePendingTransition

    原文地址:http://blog.sina.com.cn/s/blog_706c449f01011s3v.html overridePendingTransition 在startActivity() ...

  7. Codevs 1669 运输装备

    时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 德国放松对英国的进攻后,把矛头指向了东北—— ...

  8. 3月3日(4) Binary Tree Inorder Traversal

    原题: Binary Tree Inorder Traversal 和 3月3日(2) Binary Tree Preorder Traversal 类似,只不过变成中序遍历,把前序遍历的代码拿出来, ...

  9. 【转】JavaScript里的this指针

    用自然语言的角度理解JavaScript中的this关键字 <script type="text/javascript"> function ftn03(){ var ...

  10. webBrowser执行js的方法,并返回值,c#后台取值

    private void Form1_Load(object sender, EventArgs e) { webBrowser1.Navigate(Application.StartupPath + ...