zoukankan      html  css  js  c++  java
  • Java——(六)Collection之Queue集合

    ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

    Queue集合

      Queue集合用于模拟队列这种数据结构,队列通常是指“先进先出‘(FIFO)的容器。队列

    的头部保存在队列中存放时间最长的元素,队列的尾部保存咋队列中存放时间最短的元素。新元

    素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常队列不允许

    随机访问队列中的元素。

      Queue接口中定义了如下几个方法:

      1)void add(Object o):将指定元素加入此队列的尾部。

      2)Object element():获取队列头部的元素,但是不删除该元素。

      3)boolean offer(Object o):将指定元素加入此队列的尾部。当时也有容量限制的队列时,

      此方法通常比add(Object o)方法更好

      4)Object peek():获取队列头部的元素,但不删除该元素,如果此队列为空,则返回null。

      5)Object poll():获取队列头部的元素,删除该元素,如果此队列为空,则返回null。

      6)Object remove():获取队列头部的元素,并删除该元素。

      Queue接口有一个PriorityQueue实现类。此外,Queue还有一个Deque接口,它的实现类

    即可当成队列使用,也可当成栈使用。Java为Deque提供了ArrayDeque和LinkedList两个实现类。

    1.PriorityQueue实现类

      PriorityQueue是一个比较标准的队列实现类。PriorityQueue保存队列元素的顺序并不是按加

    入队列的顺序,而是按队列元素的大小进行重新排列。因此当调用peek()方法或者poll()方法取出队

    列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。下面示范了

    PriorityQueue队列的用法。

    import java.util.PriorityQueue;
    
    
    public class PriorityQueueTest {
    
        public static void main(String[] args) {
    
            PriorityQueue pq = new PriorityQueue();
            
            pq.offer(6);
            pq.offer(-3);
            pq.offer(9);
            pq.offer(0);
            System.out.println(pq);
            System.out.println(pq.poll());
            System.out.println(pq.peek());
        }
    
    }

    运行结果:

    [-3, 0, 9, 6]
    -3
    0

    2.Deque接口与ArrayDeque实现类

      Deque接口是Queue接口的子接口,它代表一个双端队列,Deque接口里定义了一些双端队列

    的方法:

    1)void addFirst(Object o):将指定元素插入该双端队列的开头。

    2)void addLast(Object o):将指定元素插入该双端队列的末尾。

    3)Iterator descendingIterator():返回该双端队列对应的迭代器,该迭代器将以逆向顺序来迭代队列中的元素。

    4)Object getFirst():获取但不删除双端队列的第一个元素。
    5)Object getLast():获取但不删除双端队列的最后一个元素。

    6)boolean offerFirst(Object o):将指定元素插入该双端队列的开头。
    7)boolean offerLast(Object o):将指定元素插入该双端队列的末尾。

    8)Object peekFirst():获取但不删除该双端队列的第一个元素;如果此双端队列为空,则返回null。

    9)Object peekLast():获取但不删除该双端队列的最后一个元素;如果此双端队列为空,则返回null。

    10)Object pollFirst():获取并删除该双端队列的第一个元素;如果此双端队列为空,则返回null。

    11)Object pollLast():获取并删除该双端队列的最后一个元素;如果此双端队列为空,则返回null。

    12)Object pop()(栈方法):pop出该双端队列所表示的栈顶元素。相当于removeFirst()。

    13)void push(Object o)(栈方法):将一个元素push进该双端队列所表示的栈的栈顶。相当于addFirst(o)。
    14)Object removeFirst():获取并删除该双端队列的第一个元素。

    15)Object removeFirstOccurrence(Object o):删除该双端队列的第一次出现的元素o。
    16)removeLast():删除该双端队列的最后一个元素。

    17)removeFirstOccurrence(Object o):删除该双端队列的最后一次出现的元素o。

      Deque接口提供了一个典型的实现类:ArrayDeque,它是一个基于数字实现的双端队列,创建Deque时

    可以指定一个numElement参数,该参数用于指定Object[]数组的长度;如果不指定numElement参数,

    Deque底层数组的长度为16.

    提示:ArrayList和arrayDeque两个集合类的实现机制基本相似,它们的底层都采用一个动态的、可重分配的

    Object[]数组来存储集合元素,当集合元素超出了该数组的容器时,系统会在底层重新分配一个Object[]数组

    来存储集合元素。

    2.LinkedList实现类

      LinkedList类是List接口的实现类,此外,LinkedList还实现了Deque接口。下面程序示范了LinkedList集

    合的用法。

     1 import java.util.LinkedList;
     2 
     3 
     4 public class LinkedListTest {
     5 
     6     public static void main(String[] args) {
     7 
     8         LinkedList llLinkedList = new LinkedList<>();
     9         //将字符串元素加入队列尾部
    10         llLinkedList.offer("黑马程序员");
    11         //将字符串元素加入栈的栈顶
    12         llLinkedList.push("传智播客");
    13         //将字符串元素添加到队列的头部,相当于栈的顶部
    14         llLinkedList.offerFirst("CSDN");
    15         
    16         for (int i = 0; i < llLinkedList.size(); i++) {
    17             System.out.println(llLinkedList.get(i));
    18         }
    19         //访问但不删除栈顶一个元素
    20         System.out.println(llLinkedList.peekFirst());
    21         //访问但不删除队列的最后一个元素
    22         System.out.println(llLinkedList.peekLast());
    23         //将栈顶的元素弹出“栈”
    24         System.out.println(llLinkedList.pop());
    25         //可以看到队列中的第一个元素被删除
    26         System.out.println(llLinkedList);
    27         //访问并删除队列的最后一个元素
    28         System.out.println(llLinkedList.pollLast());
    29         System.out.println(llLinkedList);
    30     }
    31 
    32 }

    运行结果:

    CSDN
    传智播客
    黑马程序员
    CSDN
    黑马程序员
    CSDN
    [传智播客, 黑马程序员]
    黑马程序员
    [传智播客]

       LinkedList与ArrayList、ArrayDeque的实现机制完全不同,ArrayList、ArrayDeque内部

    以数组的形式来保存集合中的元素,因此随机访问集合元素时有较好的性能;而LinkedList内部以

    链表的形式来保存集合中的元素,因此随机访问集合元素时性能较差,但在插入、删除元素时性能

    非常出色(只需改变指针所指的地址即可)。需要指出的是,虽然Vector也是以数组的形式来存储

    集合元素的,但因为他实现了线程同步功能,所以各方面性能都有所下降。

  • 相关阅读:
    python三大神器
    centos安装fish shell
    linux查看日志
    web攻击
    web安全之XSS
    JSONP && CORS
    css 定位
    MIT-线性代数笔记(1-6)
    es6 Object.assign
    ECMAScript 6 笔记(六)
  • 原文地址:https://www.cnblogs.com/xiongxuesong/p/4567837.html
Copyright © 2011-2022 走看看