zoukankan      html  css  js  c++  java
  • java队列

    转自:http://www.cnblogs.com/mercuryli/p/4636231.html

    什么是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也是以数组的形式来存储集合但因为它实现了线程同步(而且实现的机制不好),故各方面的性能都比较差。

  • 相关阅读:
    php小结
    HTML-WEB前端-photoshop切图抠图详解
    JS面向对象的程序设计
    AJAX同步与异步的区别
    数据库的优化
    phpcms网站搬家 至 服务器 完整并且详细过程
    phpcms网页替换验证码功能 及 搜索功能
    用phpcms切换中英文网页的方法(不用解析二级域名)、phpcms完成pc和手机端切换(同一域名)
    JS常用屏蔽代码
    信息安全政策(隔离与监控)
  • 原文地址:https://www.cnblogs.com/guoliangxie/p/7522114.html
Copyright © 2011-2022 走看看