`
masterzs
  • 浏览: 17420 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDK学习之Queue

阅读更多

今天学习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
8
1
分享到:
评论
5 楼 askyuan 2010-04-20  
UML图画的很漂亮呀,呵呵
4 楼 huatu122 2010-04-19  
你的uml类图很美啊
3 楼 masterzs 2010-04-12  
jerryfeng 写道
看样子,象是在IDEA里面用yfiles出的图
http://www.yworks.com/en/products_yfiles_about.html
因为那图左下角写着的Powered by yFiles
很久没用IDEA了,不过Interface/Class的图标我还认得

That's correct
2 楼 jerryfeng 2010-04-12  
看样子,象是在IDEA里面用yfiles出的图
http://www.yworks.com/en/products_yfiles_about.html
因为那图左下角写着的Powered by yFiles
很久没用IDEA了,不过Interface/Class的图标我还认得
1 楼 palmelf 2010-04-11  
你用的uml画图工具是什么? 很漂亮的。

相关推荐

    JDK容器学习之Queue:LinkedBlockingQueue

    在Java的并发编程中,JDK提供的容器类库扮演了重要角色,其中`java.util.concurrent`包下的`BlockingQueue`接口及其实现类是多线程环境下数据同步的重要工具。本篇文章将深入探讨`LinkedBlockingQueue`,这是一个...

    JDK部分类UML图

    JDK的集合框架是Java编程中最基础且重要的部分之一,它提供了数据存储和管理的一系列接口和类。Collection接口作为最顶层的接口,定义了所有集合的基本操作,如添加元素、删除元素和遍历元素。List接口扩展了...

    Java JDK 6学习笔记——ppt简体版

    本篇学习笔记将围绕Java JDK 6的关键特性进行深入探讨。 一、Java基础 1. 类与对象:Java是一种面向对象的语言,JDK 6在类和对象的创建、继承和多态性方面提供了丰富的支持。理解类的定义、对象的实例化以及接口的...

    JDK 6学习笔记——PPT简体版

    **JDK 6学习笔记——PPT简体版** Java Development Kit(JDK)是Java编程语言的核心组件,它提供了开发和运行Java应用程序所需的工具和环境。JDK 6是Oracle公司发布的一个重要版本,为开发者带来了许多改进和新特性...

    jdk1.7源码包含util

    Java开发工具包(Java Development Kit,简称JDK)是Java编程语言的标准开发环境,它包含了编译器、运行时环境以及一系列的API。在JDK 1.7版本中,"util"指的是`...同时,这也是学习Java语言和提升编程能力的重要途径。

    JavaJDK6学习教程ppt简体中文版附课本代码

    Java JDK6学习教程是针对Java开发...通过这些教程和代码实例,你将能够全面掌握Java JDK6的基础知识和实际应用,为你的Java开发之路打下坚实的基础。同时,不断地练习和实践中,你将逐渐成长为一名熟练的Java开发者。

    JDK 帮助文档 中文

    对于开发者来说,JDK的帮助文档是理解和学习Java的重要资源。中文版的JDK帮助文档,解决了那些英语不熟练的开发者在查阅官方文档时的语言难题,使得他们能够更方便地获取到Java相关的技术信息。 **1. Java API 文档...

    java jdk 实例宝典学习

    Java JDK实例宝典学习是Java开发者提升技能的重要资源,它包含了大量的源代码示例,旨在帮助初学者和有经验的...记得,每个示例都是一次学习和进步的机会,要耐心研究,勇于尝试,你的Java之旅将因此变得更加丰富多彩。

    jdk1.6中文api

    **正文** ...综上所述,JDK 1.6中文API不仅是Java开发者必备的参考文档,也是学习和掌握Java核心技术的基石。通过查阅和实践,开发者可以不断提升自己的技能,解决实际问题,编写出高效、稳定的代码。

    JDK1.6 API_CN.CHM

    《JDK1.6 API_CN.CHM》是一个针对Java开发者的重要参考资料,它是Java Development Kit (JDK) 1.6版本的中文API...尽管现在JDK已经更新到更高的版本,但学习1.6版的API仍然有助于理解后来版本中的新特性及其演变过程。

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》将IDE操作纳为教学内容之一,使读者能与实践结合,提供的视频教学能更清楚地帮助读者掌握操作步骤。 内容简介 书籍 计算机书籍  《java jdk 7学习笔记》是作者多年来教学实践经验的总结...

    java jdk api中文开发文档(免币)

    这份文档是开发者学习和理解Java编程语言以及其库功能的关键工具。以下是该文档中涉及的一些核心知识点: 1. **Java语言基础**:文档详细介绍了Java的基本语法,包括数据类型、变量、运算符、控制流(如if-else,...

    JDK1.6.02 API文档 手机版(全)

    - `interface Collection`:集合框架的基本接口,包含`List`、`Set`和`Queue`等子接口。 2. **集合框架**: - `ArrayList`和`LinkedList`:两种常见的列表实现,前者基于数组,后者基于链表。 - `HashMap`和`...

    JDK_API_1_6中文版chm

    2. **集合框架**:在JDK 1.6中,集合框架得到了进一步完善,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Map(如HashMap和TreeMap)以及Queue(如ArrayDeque)等接口和实现类。此外,还有泛型...

    Jdk+api+1.6+英文原版 CHM格式

    3. **java.util**:这个包提供了一组实用工具类,包括集合框架(如ArrayList、LinkedList、HashMap)、日期/时间操作(如Date、Calendar)、随机数生成(Random)、队列(Queue)等。集合框架是Java编程中不可或缺的...

    jdk类库详细解析再也找不到更详细的了

    4. **java.util.collections**:集合框架的核心,包括List、Set、Queue等接口,以及它们的实现类,如ArrayList、LinkedList、HashSet、TreeSet等。这些类提供了数据存储和管理的功能。 5. **java.util.Map**:Map...

    IBM MQ jdk1.7以上

    IBM MQ,全称为IBM Message Queue,是IBM公司推出的一款企业级消息中间件产品,它在IT行业中扮演着至关重要的角色,特别是在大型企业系统集成和数据通信方面。此解决方案旨在提供可靠、高效且安全的数据传输机制,...

    JDK源码之PriorityQueue解析

    JDK源码之PriorityQueue解析 一、优先队列的应用 优先队列是程序开发中常用的数据结构之一。它可以应用于多个领域,如操作系统的进程调度、爬虫系统的任务调度等。在这些应用中,优先队列可以确保高优先级的任务或...

Global site tag (gtag.js) - Google Analytics