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也是以数组的形式来存储

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

  • 相关阅读:
    A Node Influence Based Label Propagation Algorithm for Community detection in networks 文章算法实现的疑问
    Fast Newman-FN算法以及模块度定义介绍
    Label Propagation Algorithm LPA 标签传播算法解析及matlab代码实现
    设计一个smartnic
    Intel GEN11 GPU
    Intel GEN9 GPU
    Shared Virtual Memory (SVM) Functions
    connect via ssh to virtualbox guest vm without knowing ip address
    smartnic
    技术精品翻译
  • 原文地址:https://www.cnblogs.com/xiongxuesong/p/4567837.html
Copyright © 2011-2022 走看看