今天学习Queue,基本数据类型,特点先进先出(FIFO)。
1.JDK中接口的定义:
在jdk里边,LinkedList直接实现的Queue接口,所以我们可以使用LinkedList来模拟Queue,看一下几个
主要方法:
2,主要方法解析:
加入一条记录,offer(E o)
public boolean offer(E o) {
return add(o);
}
可以看到内部默认调用LinkedList的add方法,也就是默认放到队尾,head的previous指向,
取出一条记录,
public E poll() {
if (size==0)
return null;
return removeFirst();
}
调用LinkedList的removeFirst方法,再看这个方法的实现:
public E removeFirst() {
return remove(header.next);
}
结果就是删除head.next指向的数据项,就是队列的第一个条数据,也是最早进入队列的数据。
下边我们看下JDK中的继承关系,其中有个PriorityQueue,优先队列,怎么个优先法呢,我们看看其增加和删除方法
看下其成员变量和构造函数:
private static final int DEFAULT_INITIAL_CAPACITY = 11;
private transient Object[] queue;
private int size = 0;
private final Comparator<? super E> comparator;
private transient int modCount = 0;
public PriorityQueue(int initialCapacity,
Comparator<? super E> comparator) {
if (initialCapacity < 1)
throw new IllegalArgumentException();
this.queue = new Object[initialCapacity + 1];
this.comparator = comparator;
}
从这里我们看到其内部是通过数组来实现存储,构造函数,默认初始化一个queue,下边我们通过添加一条数据来看看为什么称为优先级队列,
增加一条数据,
public boolean offer(E o) {
if (o == null)
throw new NullPointerException();
modCount++;
++size;
// Grow backing store if necessary
if (size >= queue.length)
grow(size);
queue[size] = o;
fixUp(size);
return true;
}
关键看fixUp这个函数,
private void fixUp(int k) {
if (comparator == null) {
while (k > 1) {
int j = k >> 1;
if (((Comparable<E>)queue[j]).compareTo((E)queue[k]) <= 0)
break;
Object tmp = queue[j]; queue[j] = queue[k]; queue[k] = tmp;
k = j;
}
} else {
while (k > 1) {
int j = k >>> 1;
if (comparator.compare((E)queue[j], (E)queue[k]) <= 0)
break;
Object tmp = queue[j]; queue[j] = queue[k]; queue[k] = tmp;
k = j;
}
}
}
首先判断是否有实现的comparator接口的函数,如果没有说明默认为实现Comparable接口,然后用折半查找进行排序,否则就是用实现了Comparator接口的类进行比较,现在我们
知道了如果使用PriorityQueue,其加入的类应该实现Comparable接口,或者提供一个Comparator比较器,默认String会安装首字母顺序排序。
从队列中删除一条记录,poll():
public E poll() {
if (size == 0)
return null;
modCount++;
E result = (E) queue[1];
queue[1] = queue[size];
queue[size--] = null; // Drop extra ref to prevent memory leak
if (size > 1)
fixDown(1);
return result;
}
关键方法fixDown,看一下其实现:
private void fixDown(int k) {
int j;
if (comparator == null) {
while ((j = k << 1) <= size && (j > 0)) {
if (j<size &&
((Comparable<E>)queue[j]).compareTo((E)queue[j+1]) > 0)
j++; // j indexes smallest kid
if (((Comparable<E>)queue[k]).compareTo((E)queue[j]) <= 0)
break;
Object tmp = queue[j]; queue[j] = queue[k]; queue[k] = tmp;
k = j;
}
} else {
while ((j = k << 1) <= size && (j > 0)) {
if (j<size &&
comparator.compare((E)queue[j], (E)queue[j+1]) > 0)
j++; // j indexes smallest kid
if (comparator.compare((E)queue[k], (E)queue[j]) <= 0)
break;
Object tmp = queue[j]; queue[j] = queue[k]; queue[k] = tmp;
k = j;
}
}
}
跟添加逻辑是相似的,需要对现有数据进行重新排序。
3 典型案例
我们通过一个例子来看看PriorityQueue的应用:
Person类:
public class Person implements Comparable{
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public int compareTo(Object o) {
return this.age.compareTo(((Person)o).getAge());
}
}
主调用类:
public class QueueTest {
public static void main(String[] args) {
Queue<Person> queue = new PriorityQueue<Person>();
Person p = new Person();
p.setAge("23");
Person p1 = new Person();
p1.setAge("34");
Person p2 = new Person();
p2.setAge("12");
Person p3 = new Person();
p3.setAge("12");
Person p4 = new Person();
p4.setAge("83");
queue.offer(p);
queue.offer(p1);
queue.offer(p2);
queue.offer(p3);
queue.offer(p4);
while(!queue.isEmpty()){
System.out.print(queue.poll().getAge()+" ");
}
}
}
打印结果:
12 12 23 34 83
4 总结
本人在实际项目中从未使用过Queue,但是其思想可以为我们所用,优先级队列在插入和删除的时候,需要重新排序,会有一定的性能损失。大家有没有在实际项目中应用Queue,
有的话,可以留言进行讨论,谢谢。
- 大小: 7.8 KB
- 大小: 18.8 KB
分享到:
相关推荐
在Java的并发编程中,JDK提供的容器类库扮演了重要角色,其中`java.util.concurrent`包下的`BlockingQueue`接口及其实现类是多线程环境下数据同步的重要工具。本篇文章将深入探讨`LinkedBlockingQueue`,这是一个...
JDK的集合框架是Java编程中最基础且重要的部分之一,它提供了数据存储和管理的一系列接口和类。Collection接口作为最顶层的接口,定义了所有集合的基本操作,如添加元素、删除元素和遍历元素。List接口扩展了...
本篇学习笔记将围绕Java JDK 6的关键特性进行深入探讨。 一、Java基础 1. 类与对象:Java是一种面向对象的语言,JDK 6在类和对象的创建、继承和多态性方面提供了丰富的支持。理解类的定义、对象的实例化以及接口的...
**JDK 6学习笔记——PPT简体版** Java Development Kit(JDK)是Java编程语言的核心组件,它提供了开发和运行Java应用程序所需的工具和环境。JDK 6是Oracle公司发布的一个重要版本,为开发者带来了许多改进和新特性...
Java开发工具包(Java Development Kit,简称JDK)是Java编程语言的标准开发环境,它包含了编译器、运行时环境以及一系列的API。在JDK 1.7版本中,"util"指的是`...同时,这也是学习Java语言和提升编程能力的重要途径。
Java JDK6学习教程是针对Java开发...通过这些教程和代码实例,你将能够全面掌握Java JDK6的基础知识和实际应用,为你的Java开发之路打下坚实的基础。同时,不断地练习和实践中,你将逐渐成长为一名熟练的Java开发者。
对于开发者来说,JDK的帮助文档是理解和学习Java的重要资源。中文版的JDK帮助文档,解决了那些英语不熟练的开发者在查阅官方文档时的语言难题,使得他们能够更方便地获取到Java相关的技术信息。 **1. Java API 文档...
Java JDK实例宝典学习是Java开发者提升技能的重要资源,它包含了大量的源代码示例,旨在帮助初学者和有经验的...记得,每个示例都是一次学习和进步的机会,要耐心研究,勇于尝试,你的Java之旅将因此变得更加丰富多彩。
**正文** ...综上所述,JDK 1.6中文API不仅是Java开发者必备的参考文档,也是学习和掌握Java核心技术的基石。通过查阅和实践,开发者可以不断提升自己的技能,解决实际问题,编写出高效、稳定的代码。
《JDK1.6 API_CN.CHM》是一个针对Java开发者的重要参考资料,它是Java Development Kit (JDK) 1.6版本的中文API...尽管现在JDK已经更新到更高的版本,但学习1.6版的API仍然有助于理解后来版本中的新特性及其演变过程。
《Java JDK 7学习笔记》将IDE操作纳为教学内容之一,使读者能与实践结合,提供的视频教学能更清楚地帮助读者掌握操作步骤。 内容简介 书籍 计算机书籍 《java jdk 7学习笔记》是作者多年来教学实践经验的总结...
这份文档是开发者学习和理解Java编程语言以及其库功能的关键工具。以下是该文档中涉及的一些核心知识点: 1. **Java语言基础**:文档详细介绍了Java的基本语法,包括数据类型、变量、运算符、控制流(如if-else,...
- `interface Collection`:集合框架的基本接口,包含`List`、`Set`和`Queue`等子接口。 2. **集合框架**: - `ArrayList`和`LinkedList`:两种常见的列表实现,前者基于数组,后者基于链表。 - `HashMap`和`...
2. **集合框架**:在JDK 1.6中,集合框架得到了进一步完善,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Map(如HashMap和TreeMap)以及Queue(如ArrayDeque)等接口和实现类。此外,还有泛型...
3. **java.util**:这个包提供了一组实用工具类,包括集合框架(如ArrayList、LinkedList、HashMap)、日期/时间操作(如Date、Calendar)、随机数生成(Random)、队列(Queue)等。集合框架是Java编程中不可或缺的...
4. **java.util.collections**:集合框架的核心,包括List、Set、Queue等接口,以及它们的实现类,如ArrayList、LinkedList、HashSet、TreeSet等。这些类提供了数据存储和管理的功能。 5. **java.util.Map**:Map...
IBM MQ,全称为IBM Message Queue,是IBM公司推出的一款企业级消息中间件产品,它在IT行业中扮演着至关重要的角色,特别是在大型企业系统集成和数据通信方面。此解决方案旨在提供可靠、高效且安全的数据传输机制,...
JDK源码之PriorityQueue解析 一、优先队列的应用 优先队列是程序开发中常用的数据结构之一。它可以应用于多个领域,如操作系统的进程调度、爬虫系统的任务调度等。在这些应用中,优先队列可以确保高优先级的任务或...