接上篇“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的基础例子:
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random; /**
* @author jp
*@date 2013-12-16
*/
public class queuedemo {
public static void printqueue(Queue queue) {
while (queue.peek() != null) {
System.out.print(queue.remove() + " ");
}
System.out.println();
}
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<Integer>();
Random random = new Random(32);
for (int i = 0; i < 10; i++)
queue.offer(random.nextInt(i + 10));
printqueue(queue);
Queue<Character> qCharacters = new LinkedList<Character>();
for(char c: "GreatUniversity".toCharArray())
qCharacters.offer(c);
printqueue(qCharacters);
}
}

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()等方法获取元素时,得到的是具有最高优先级的的元素。另外,在学习数据结构堆排序的时候,老师跟我们讲得一般都是基于大顶堆而不是小顶堆,因为一般小顶堆通常用来实现维持优先级队列。下面举例说明:
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.Set; /**
* @author jp
*@date 2013-12-16
*/
public class priorityqueuedemo {
public static void printqueue(Queue queue) {
while (queue.peek() != null) {
System.out.print(queue.remove() + " ");
}
System.out.println();
}
public static void main(String[] args) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>();
Random random = new Random(32);
for(int i = 0;i < 10; i++)
priorityQueue.offer(random.nextInt(i + 10));
printqueue(priorityQueue);
java.util.List<Integer> list = Arrays.asList(12,14,15,16,17,18,19,20);
priorityQueue = new PriorityQueue<Integer>(list);
printqueue(priorityQueue);
priorityQueue = new PriorityQueue<Integer>(list.size(), Collections.reverseOrder());
priorityQueue.addAll(list);
printqueue(priorityQueue); String string = "i have a great dream";
Set<Character> charset = new HashSet<Character>();
for (char c: string.toCharArray()) {
charset.add(c);
}
PriorityQueue<Character> pCharacters = new PriorityQueue<Character>(charset);
printqueue(pCharacters);
}
}

Output:

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

import java.util.*;

class ToDoList extends PriorityQueue<ToDoList.ToDoItem> {

	static class ToDoItem implements Comparable<ToDoItem> {
private char primary;
private int secondary;
private String item; public ToDoItem(String s, char c, int i) {
primary = c;
secondary = i;
item = s;
} /*
* @see java.lang.Comparable#compareTo(java.lang.Object)
* @implements Comparabale,then define the CompareTo()
* @function firstly compare "key value",then "secondary value"(+1,0,-1)
*/
public int compareTo(ToDoItem arg) {
if(primary > arg.primary)
return +1;
if(primary == arg.primary)
if(secondary > arg.secondary)
return +1;
else if(secondary == arg.secondary)
return 0;
return -1;
} public String toString() {
return Character.toString(primary) + secondary +": " + item;
}
} public void add(String s, char c, int i) {
super.add(new ToDoItem(s, c, i));
} public static void main(String[] args) {
ToDoList toDoList = new ToDoList();
toDoList.add("allen",'a',2);
toDoList.add("jackson",'a',3);
toDoList.add("davil",'b',3);
toDoList.add("avily",'b',2);
while (!toDoList.isEmpty()) {
System.out.println(toDoList.remove());
}
}
}

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. Cryptography - JavaScript 加密算法库

    Example 1: The following example uses aes function. <script type="text/javascript" src= ...

  2. Android开发之AlarmManager详解

    AlarmManager实质是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service,BroadcastReceiver ...

  3. jQuery Ajax应用

    jQuery Ajax应用 本章主要了解jQuery的Ajax与传统的Ajax的区别,掌握JQuery的Ajax常用的方法与Ajax相关的函数. 详细内容,请点击jQuery Ajax应用查看:

  4. html有序列表和无序列表

    css控制UL LI 的样式详解(推荐) CSS: 代码如下: #menu ul {list-style:none;margin:0px;} #menu ul li {float:left;} 代码如 ...

  5. ASP.NET 跨域获取JSON天气数据

    前几天做一个门户网站,在首页需要加载气象数据,采用了中央气象局的接口. 刚开始采用JSONP在前台跨域请求数据,没成功~ 后换成在c#后台请求数据返回... 前端代码: $(function () { ...

  6. CSS伪对象选择符整理

    1.E::selection 2.E::placeholder 1. E::selection 设置对象被选择时的样式. 需要注意的是,::selection只能定义被选择时的background-c ...

  7. 让apache与mysql随着系统自动启动

    让apache与mysql随着系统自动启动 在Linux中有一个文件/etc/rc.d/rc.local文件,其系统在启动时会自动加载该文件,我们可以把要启动的服务放入这个文件中即可. 添加以下代码:

  8. java虚拟机理解探索1

    以下内容源于个人对<深入java虚拟机>的理解总结 基本概念: java虚拟机可以指一种抽象规范,也可以指一种具体实现,亦可以指一个java虚拟机实例. 虚拟机生命周期: 一个java虚拟 ...

  9. 关于MD5加密的小知识

    - (NSString *)MD5Hash { const char *cStr = [self UTF8String]; unsigned char result[16]; CC_MD5(cStr, ...

  10. 使用ANT 生成Xfire 客户端端文件

    这里需要用到的JAR包 : XmlSchema-1.1.jar activation-1.1.jar commons-codec-1.3.jar commons-httpclient-3.0.jar ...