美文网首页
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