1.介绍
- Queue 接口存在于 java.util 包中,它扩展了 Collection 接口,用于保存将要以
FIFO(先进先出)
顺序处理的元素。 - 它是一个
有序的对象列表
,其用途仅限于在列表末尾插入元素
和从列表开头删除元素
(即),它遵循FIFO
或先进先出
原则。
作为一个接口,队列需要一个具体的类来声明,最常见的类是 Java 中的PriorityQueue
和LinkedList
。请注意,这些实现都不是线程安全的
。如果需要线程安全实现,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。 |