1.介绍

  • Queue 接口存在于 java.util 包中,它扩展了 Collection 接口,用于保存将要以 FIFO(先进先出)顺序处理的元素。
  • 它是一个有序的对象列表,其用途仅限于在列表末尾插入元素从列表开头删除元素(即),它遵循FIFO先进先出原则。

    作为一个接口,队列需要一个具体的类来声明,最常见的类是 Java 中的 PriorityQueueLinkedList。请注意,这些实现都不是线程安全的。如果需要线程安全实现,PriorityBlockingQueue 是一种替代实现。
public interface Queue extends Collection

创建队列对象:由于队列一个接口,因此不能创建队列类型的对象。我们总是需要一个扩展这个列表的类来创建一个对象
而且,在Java 1.5引入泛型后,可以限制Queue中可以存储的对象类型。这个类型安全的队列可以定义为:

// Obj is the type of the object to be stored in Queue 
Queue<Obj> queue = new PriorityQueue<Obj> ();
public class Test2 {
    public static void main(String[] args) {
        Queue<Integer> q= new LinkedList<>();
        for (int i = 0; i < 5; i++) {
            q.add(i);
        }
        System.out.println("Elements of queue "+ q);
        int remove = q.remove();//删除队列的头部。
        System.out.println("removed element-"   + remove);
        System.out.println("Elements of queue "+q);
        int head = q.peek();//查看队头
        System.out.println("head of queue-"+ head);
        int size = q.size();
        System.out.println("Size of queue-"  + size);
    }
}
Elements of queue [0, 1, 2, 3, 4]
removed element-0
Elements of queue [1, 2, 3, 4]
head of queue-1
Size of queue-4

2.队列接口操作

=队列的特征:

  • Queue 用于在队列末尾插入元素并从队列开头移除元素。它遵循先进先出的概念。
  • Java Queue 支持 Collection 接口的所有方法包括插入、删除等。
  • LinkedList、ArrayBlockingQueue 和 PriorityQueue是最常用的实现。
  • 如果对 BlockingQueues 执行任何null操作,则会抛出 NullPointerException
  • java.util 包中可用的队列是无界队列
  • java.util.concurrent 包中可用的队列是有界队列
  • 除了 Deques 之外的所有 Queues 都支持分别在队尾和队头插入和移除 Deques 支持在两端插入和移除元素。

实现队列接口的类:

1. PriorityQueue

在集合框架中实现的PriorityQueue类为我们提供了一种根据优先级处理对象的方法。众所周知队列是遵循先进先出算法的,但是有时候需要按照优先级来处理队列中的元素,这时候PriorityQueue就派上用场了。让我们看看如何使用此类创建队列对象。

public class Test2 {
    public static void main(String[] args) {
        Queue<Integer> pq = new PriorityQueue<Integer>();
        pq.add(1);
        pq.add(2);
        pq.add(3);
        System.out.println(pq);
        System.out.println(pq.peek());
        System.out.println(pq.poll());
        System.out.println(pq.peek());
    }
}
[1, 2, 3]
1
1
2

2.LinkedList

  • LinkedList是在集合框架中实现的一个类,它本身就实现了链表数据结构
  • 它是一种线性数据结构,其中元素不存储在连续位置,每个元素都是一个具有数据部分地址部分的单独对象。
  • 这些元素使用指针和地址链接。每个元素称为一个节点。
  • 由于插入删除动态性和易用性,它们优于数组或队列。让我们看看如何使用此类创建队列对象。
public class Test2 {
    public static void main(String[] args) {
        Queue<Integer> lk= new LinkedList<Integer>();
        lk.add(1);
        lk.add(2);
        lk.add(3);
        System.out.println(lk);
        System.out.println(lk.peek());
        System.out.println(lk.poll());
        System.out.println(lk.peek());
    }
}
[1, 2, 3]
1
1
2

3. PriorityBlockingQueue

  • 需要注意的是,PriorityQueue LinkedList 这两个实现都不是线程安全的
  • 如果需要线程安全实现,PriorityBlockingQueue 是一种替代实现。
  • PriorityBlockingQueue 是一个无限阻塞队列,它使用与类PriorityQueue相同的排序规则并提供阻塞检索操作。
  • 由于是无界的,添加元素有时可能会因为资源耗尽而失败导致OutOfMemoryError。让我们看看如何使用此类创建队列对象。
public class Test2 {
    public static void main(String[] args) {
        Queue<Integer> pbq = new PriorityBlockingQueue<Integer>();
        pbq.add(1);
        pbq.add(2);
        pbq.add(3);
        System.out.println(pbq);
        System.out.println(pbq.peek());
        System.out.println(pbq.poll());
        System.out.println(pbq.peek());
    }
}
[1, 2, 3]
1
1
2

3.队列接口的方法

方法

描述

add(int index, element)

此方法用于在队列中的特定索引处添加元素。当传递单个参数时,它只是将元素添加到队列的末尾。

addAll(int index, Collection collection)

此方法用于将给定集合中的所有元素添加到队列中。当传递单个参数时,它会将给定集合的所有元素添加到队列的末尾。

size()

此方法用于返回队列的大小。

clear()

此方法用于移除队列中的所有元素。但是,创建的队列的引用仍然被存储。

remove()

此方法用于从队列的前面删除元素。

remove(int index)

此方法从指定索引中删除一个元素。它将后续元素(如果有)向左移动并将其索引减 1。

remove(element)

此方法用于删除并返回队列中给定元素的第一次出现。

get(int index)

此方法返回指定索引处的元素。

set(int index, element)

此方法用新元素替换给定索引处的元素。此函数返回刚刚被新元素替换的元素。

indexOf(element)

此方法返回给定元素的第一次出现,如果该元素不在队列中,则返回-1 。

lastIndexOf(element)

此方法返回给定元素的最后一次出现,如果该元素不在队列中,则返回-1 。

equals(element)

此方法用于比较给定元素与队列元素的相等性。

hashCode()

此方法用于返回给定队列的哈希码值。

isEmpty()

此方法用于检查队列是否为空。如果队列为空则返回 true,否则返回 false。

contains(element)

此方法用于检查队列是否包含给定元素。如果队列包含该元素,则返回 true。

containsAll(Collection collection)

此方法用于检查队列是否包含所有元素集合。

sort(Comparator comp)

此方法用于根据给定的比较器对队列的元素进行排序。

boolean add(object)

该方法用于将指定元素插入队列,成功返回true。

boolean offer(object)

该方法用于将指定的元素插入到队列中。

Object poll()

此方法用于检索和删除队列的头部,如果队列为空,则返回 null。

Object element()

此方法用于检索但不删除队列的头部。

Object peek()

此方法用于检索但不删除此队列的头部,如果此队列为空,则返回 null。