欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java Queue集合

程序员文章站 2024-03-18 11:22:10
...

Queue集合

Queue用于模拟队列数据结构。
通常指先进先出(FIFO)的容器。
新元素插入到队尾, 获取元素会返回队头的元素, 通常,不允许随机访问队列中的元素。
Queue 是继承于 Collection接口。

public interface Queue<E> extends Collection<E> {

}

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

  • add() :指定元素加入到队列的尾部
  • element(): 获取头部元素,但不删除该元素
  • offer():指定元素加入到队列尾部,如果发现队列已满无法添加的话,会直接返回false。
  • peek(): 获取头部元素, 但是不删除, 队列为空,返回 null
  • poll(): 获取头部元素,并删除该元素, 队列为空,返回Null
  • remove():回去头部元素,并删除该元素

PriorityQueue

PriorityQueue 是 Queue的实现类。

public class PriorityQueue<E> extends AbstractQueue<E>
    implements java.io.Serializable {
}

public abstract class AbstractQueue<E>
    extends AbstractCollection<E>
    implements Queue<E> {
}

PriorityQueue 不是绝对标准的队列实现。
PriorityQueue 保存元素的顺序不是按照加入队列的顺序, 而是按照元素的大小重新排序。

        PriorityQueue priorityQueue = new PriorityQueue();
        priorityQueue.offer(4);
        priorityQueue.offer(-2);
        priorityQueue.offer(8);
        priorityQueue.offer(6);

        System.out.println(priorityQueue);
        System.out.println(priorityQueue.poll());
//Output
[-2, 4, 8, 6]
-2

上面输出并没有完全按照大小排序输出,这只是受到toString()方法返回值的影响, 实际上多次 poll(),元素是按照从小到大移出队列。
PriorityQueue 不允许插入 null元素,需要对元素进行排序,
排序有 自然排序 和 定制排序 两种, 和 TreeSet 基本一致。

Deque集合

Deque接口 是 Queue 接口的子接口。 代表双端队列。

public interface Deque<E> extends Queue<E> {

}

Deque 还可当做栈来使用, 包含了 pop() 出栈 和 push()入栈两个方法。
主要包括以下方法:

  • addFirst() :插入开头
  • addLast(): 插入末尾
  • descendingIterator(): 返回对应的迭代器,以逆向顺序来迭代队列
  • getFirst(): 获取不删除第一个元素
  • getLast(): 获取不删除最后一个元素
  • offerFirst(): 插入开头
  • offerLast(): 插入末尾
  • peekFirst():获取不删除第一个元素
  • peekLast(): 获取不删除最后一个元素
  • pollFirst(): 获取,删除第一个
  • pollLast(): 获取, 删除最后一个
  • removeFirst(): 获取, 删除一个
  • removeFirstOccurrence(): 删除第一次出现的元素
  • removeLast():获取,删除最后一个
  • removeLastOccurrence(): 删除最后一个出现的元素

ArrayDeque 是 Deque的实现类。是基于数组实现的双端队列。
采用动态,可重分配的Object[]数组来存储元素。
可以指定Object[]数组长度,默认为16.

public class ArrayDeque<E> extends AbstractCollection<E>
                           implements Deque<E>, Cloneable, Serializable
{
     public ArrayDeque() {
        elements = new Object[16];
    }
}

ArrayDeque 当 Stack使用

        ArrayDeque stack = new ArrayDeque();
        stack.push("A");
        stack.push("B");
        stack.push("C");
        System.out.println(stack);
        System.out.println(stack.peek());
        System.out.println(stack.pop());
        System.out.println(stack);
//Output
[C, B, A]
C
C
[B, A]

推荐使用 ArrayDeque代替 Stack,Stack是古老的集合, 性能较差。

ArrayDeque 当做队列使用, 先进先出。

        ArrayDeque queue = new ArrayDeque();
        queue.offer("A");
        queue.offer("B");
        queue.offer("C");
        System.out.println(queue);
        System.out.println(queue.peek());
        System.out.println(queue);
        System.out.println(queue.poll());
        System.out.println(queue);
//Output
[A, B, C]
A
[A, B, C]
A
[B, C]

LinkedList

LinkedList 是 List接口的实现类,可以根据索引随机访问, LinkedList还是实现类 Deque的接口。
可以当做双端队列,即可以当 栈, 也可以当 队列

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
}

LinkedList 与 ArrayList, ArrayDeque 的实现机制不同,
ArrayList, ArrayDeque 内部是数组实现,较好的随机访问。
LinkedList 是 链表形式保存元素,随机访问性能较差, 插入,删除性能较好,只需改变指针地址即可。
Vector 也是以数组形式存储元素,因为实现了线程同步功能,同步机制也不好,所以性能各方面都比较差。

性能分析

List是一个线性表接口。
ArrayList是基于数组的线性表
LinkedList 是基于链表的线性表。
Queue代表队列,Deque代表了双端队列。

由于数组是一块连续内存区保存所有的数组,所以随机访问性能最好。
而链表在插入和删除时性能较好。
因此。 ArrayList 比 LinkedList 性能要好。大部分推荐使用ArrayList。

遍历List, 对 ArrayList, Vector, 应该使用随机访问 get来遍历,这样性能好, 对于LinkedList ,应采用 迭代器 Iterator 来遍历。
对于经常插入,删除的大数据量List集合, 可使用 LinkedList. 因为 ArrayList, Vector经常分配数组大小。

地址: https://blog.csdn.net/yonggang7/article/details/86760530