美文网首页
JAVA基础——Queue集合

JAVA基础——Queue集合

作者: So_ProbuING | 来源:发表于2019-10-16 23:18 被阅读0次

    Queue集合

    Queue用于模拟队列这种数据结构,队列FIFO的容器。队列的头部保存在队列中存放时间最长的元素,队列的尾部保存在队列中存放时间最短的元素。新元素插入到队列的尾部,访问元素操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素

    API

    • void add(Object e):将指定元素加入此队列的尾部
    • boolean offer(Object e):将指定元素加入队列的尾部,使用有限容量限制的队列时,要优于add方法
    • Object element():获取队列头部的元素,但不删除该元素
    • Object peek():获取队列头部的元素,但是不删除该元素,如果队列为空,返回Null
    • Object poll():获取队列头部的元素,并删除该元素,如果队列为空,返回null
    • Object remove():获取队列头部的元素 并删除该元素

    add 、offer 都是将指定元素加入尾部,offer要比add更优

    element、remove、peek、poll 都是获取头部元素,

    element只获取不删除,队列为空调用会抛出NoSuchElementException

    peek只获取不删除,如果队列为空返回null

    poll获取元素并删除,队列为空返回null

    remove获取队列头部元素并删除,如果队列为null会抛出NoSuchElementException

    PriorityQueue实现类

    PriorityQueue保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。当调用peek()方法或者poll()方法取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素

    PriorityQueue<Integer> pq = new PriorityQueue<>();
            //添加数据到头部
            pq.add(1);
            //添加
            pq.offer(2);
            pq.offer(3);
            pq.offer(4);
            pq.offer(5);
            //获取头部元素 但不删除
            System.out.println("element 获取元素" + pq.element());
            System.out.println("peek获取元素" + pq.peek());
            System.out.println("poll获取元素" + pq.poll());
            System.out.println("remove" + pq.remove());
            //获取头部元素
            System.out.println("集合尺寸" + pq.size());
    

    PriorityQueue不允许插入null元素

    PriorityQueue的元素有两种排序方式

    • 自然排序:要求PriorityQueue集合中的元素必须实现Comparable接口
    • 定制排序 创建PriorityQueue,传入一个Comparator对象。

    Deque接口与ArrayDeque实现类

    Deque接口是Queue接口的子接口,代表一个双端队列

    API

    • void addFirst(Object e):将指定元素插入该双端队列的开头 没有返回结果
    • void addLast(Object e):将指定元素插入该双端队列的末尾 没有返回结果
    • Iterator descendingIterator():返回该双端队列对应的迭代器,该迭代器将以逆向顺序来迭代队列
    • Object getFirst() 获取但不删除第一个元素
    • Object getLast() 获取但不删除最后一个元素
    • boolean offerFirst(Object e):将指定元素插入双端队列的开头
    • boolean offerLast(Object e):将指定元素插入该双端队列的末尾
    • Object peekFirst():获取但不删除双端队列的第一个元素,如果队列为空,返回Null
    • Object peekLast():获取但不删除该双端队列的最后一个元素,如果队列为空,返回Null
    • Object pollFirst():获取并删除该双端队列的第一个元素,如果队列为空,返回Null
    • Object pollLast():获取并删除该双端队列的最后一个元素,如果队列为空,返回Null
    • Object pop():pop出双端队列所表示的栈的栈顶元素,弹栈操作
    • void push(Object e):将一个元素push进双端队列所表示的栈的栈顶
    • Object removeFirst():获取并删除该双端队列的第一个元素 如果队列为空会抛出异常
    • Object removeLast():获取并删除该双端队列的最后一个元素
    • Object removeFirstOccurrence(Object o) 删除该双端队列的第一次出现的元素o
    • Object removeLastOccurrence(Object o)删除该双端队列的最后一次出现的元素o

    Deque不仅可以当成双端队列使用,也可以当成栈来使用

    ArrayDeque 实现类

    ArrayDeque是一个基于数组实现的双端队列。创建Deque可以指定一个numElements参数,用于指定ObJect[]数组的长度。如果不指定numElements参数,Deque底层数组的长度为16

            ArrayDeque<String> stack = new ArrayDeque<>();
            stack.push("aaaa");
            stack.push("bbbb");
            stack.push("cccc");
            //弹栈
            System.out.println("弹栈" + stack.pop());
            //访问第一个元素,但不删除元素
            System.out.println("获取"+ stack.peek());
    

    当程序中需要使用”栈“,推荐使用ArrayDeque,尽量避免使用Stack,Stack性能差

    LinkedList实现类

    LinkedList类是List接口的实现类,除此之外,LinkedList还实现了Deque接口,因此LinkedList可以被当成双端队列来使用。既可以被当做栈来使用,也可以当做队列来使用

    各种线性表的性能分析

    Java提供的List就是一个线性表接口。基于数组的线性表和基于链的线性表。Queue代表队列,Deque代表了双端队列。

    如果要遍历List集合元素,对于ArrayList Vector使用get来遍历集合元素性能更好。对于LinkedList应该采用迭代器来遍历集合更好

    如果要经常执行插入、删除操作 由于ArrayList Vector要经常改变底层数组实现的大小,所以使用LinkedList集合性能更好

    如果有多个线程需要同时访问List集合中的元素,可以考虑使用线程安全的集合

    相关文章

      网友评论

          本文标题:JAVA基础——Queue集合

          本文链接:https://www.haomeiwen.com/subject/dfesmctx.html