Queue集合 与 PriorityQueue ArrayDeque LinkedList实现类相关

Posted woshi123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Queue集合 与 PriorityQueue ArrayDeque LinkedList实现类相关相关的知识,希望对你有一定的参考价值。

Queue集合

Queue用于模拟队列这种数据结构,队列通常是指“先进先出”(FIFO)容器。队列的头部元素是保存时间最长的元素,队列的尾部元素是保存时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列的头部元素。通常,队列不允许随机访问队列中的元素。

PriorityQueue实现类

PriorityQueue是一个比较标准的队列实现类,之所以说是“比较标准”,是因为,PriorityQueue保存队列元素的顺序并不是按照添加顺序,而是按队列元素的大小进行重新排列的。(从这个意义上看,PriorityQueue已经违反了队列的基本原则)

    PriorityQueue priorityQueue = new PriorityQueue();
    priorityQueue.add(100);
    priorityQueue.add(-99);
    priorityQueue.add(88);
    priorityQueue.add(-10);
    System.out.println(priorityQueue); //[-99, -10, 88, 100]

    System.out.println(priorityQueue.poll());  //访问队列的第一个元素,其实就是队列中最小的元素

PriorityQueue不允许插入null元素。

PriorityQueue的元素排序有两种方式:

  • 定制排序:创建PriorityQueue对象的时候,传入一个Comparator对象,该对象负责对队列中所有元素进行排序。采用定制排序时,不要求队列元素实现Comparable接口。
  • 自然排序:采用自然排序的PriorityQueue集合中的元素必须实现了Comparable接口,而且应该是同一个类的多个实例,否则可能导致ClassCastException异常。

Deque接口和ArrayDeque实现类:

Deque接口是Queue接口的子接口,它代表一个双端队列,Deque接口里定义了一些双端队列的方法,这些方法允许从两端来操作队列的元素。

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

ArrayDeque是一个Deque基于数组的实现类,创建Deque时同样可以指定一个numElement参数,该参数用于指定Object[]数组的长度,如果不定义numElement,则Deque底层数组的长度为16.

ArrayDeque arrayDeque = new ArrayDeque();
arrayDeque.push("直死");
arrayDeque.push("之");
arrayDeque.push("魔眼");
System.out.println(arrayDeque); //[魔眼, 之, 直死]

//访问第一个元素,但不将其pop出栈
System.out.println(arrayDeque.peek());
//pop出第一个元素
System.out.println(arrayDeque.pop());

当程序中需要使用到“栈”这种数据结构的时候,尽量避免使用Stack,使用ArrayDeque。——因为Stack是一个古老的集合,性能较差。

把PriorityQueue当队列使用:

ArrayDeque arrayDeque = new ArrayDeque();
arrayDeque.offer("两仪");
arrayDeque.offer("shiki");

//只返回队首元素,不删除
String ly = (String) arrayDeque.peek();
System.out.println(ly);
//删除队首元素,并返回
System.out.println(arrayDeque.pop());

LinkedList实现类

相当于双端队列的链表数据结构。

LinkedList linkedList = new LinkedList();
linkedList.offer("添加到队尾");
linkedList.push("添加到栈的顶部");
linkedList.offerFirst("添加到队列的头部");
//以List的方式(按索引访问)遍历集合元素
for (int i = 0;i<linkedList.size();i++){
    System.out.println("遍历LinkedList中:"+linkedList.get(i));
}
//访问并不删除队首的元素
System.out.println(linkedList.peekFirst());
//访问并不删除队尾的元素
System.out.println(linkedList.peekLast());
//将队顶的元素弹出栈
System.out.println(linkedList.pop());
//将访问并删除队尾元素
System.out.println(linkedList.pollLast());
System.out.println(linkedList);

LinkedList与ArrayList、ArrayDeque的实现机制完全不同,ArrayList、ArrayDeque内部以数组的形式来保存集合中的元素,因此随机访问集合元素时有较好的性能;而LinkedList内部以链表的形式来保存集合中的元素,因此,随机访问集合元素的性能较差,但在插入、删除元素时,性能比较出色。

以上是关于Queue集合 与 PriorityQueue ArrayDeque LinkedList实现类相关的主要内容,如果未能解决你的问题,请参考以下文章

源码阅读(14):Java中主要的QueueDeque结构——PriorityQueue集合(下)

集合(下)

源码阅读(12):Java中主要的QueueDeque结构——PriorityQueue集合(上)

.NET 6新特性试用 | PriorityQueue

Java Review (二十八集合----- Queue 集合)

Java Review (二十八集合----- Queue 集合)