zoukankan      html  css  js  c++  java
  • Java集合 之 Queue集合

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

  • 相关阅读:
    Bootstrap 2.2.2 的新特性
    Apache POI 3.9 发布,性能显著提升
    SQL Relay 0.48 发布,数据库中继器
    ProjectForge 4.2.0 发布,项目管理系统
    红帽企业 Linux 发布 6.4 Beta 版本
    红薯 快速的 MySQL 本地和远程密码破解
    MariaDB 宣布成立基金会
    Percona XtraBackup 2.0.4 发布
    Rocks 6.1 发布,光盘机群解决方案
    精通Servlet研究,HttpServlet的实现追究
  • 原文地址:https://www.cnblogs.com/mercuryli/p/4636231.html
Copyright © 2011-2022 走看看