0
点赞
收藏
分享

微信扫一扫

Java(day138):Java中的Queue接口及其实现类:LinkedList和PriorityQueue!

yundejia 05-12 12:00 阅读 15

前言

在Java中,Queue接口用于表示一种先进先出的(FIFO)数据结构,它广泛应用于任务调度、消息传递和其他需要按顺序处理元素的场景。Java提供了几种实现了Queue接口的类,其中最常用的实现类是LinkedListPriorityQueue

在这篇文章中,我们将深入探讨这两个Queue接口的实现类:LinkedListPriorityQueue,以及它们各自的特点、使用场景和适用情况。

1. LinkedList:实现Queue接口的经典实现

LinkedList是Java集合框架中的一个双向链表实现类,它实现了Queue接口并且在插入和删除元素时非常高效。LinkedList作为Queue的实现类,使用链表结构来保存队列元素,因此在插入和删除操作上具有很好的性能,特别是在队列的两端操作。

LinkedList实现Queue接口

LinkedList类实现了Queue接口,提供了按队列规则(先进先出)的插入、移除元素的方法。它还支持其他常见的集合操作,因此它既可以作为Queue使用,也可以作为ListDeque使用。

主要方法:
  • offer(E e):将元素添加到队列的尾部。如果队列已满(对于有界队列),则返回false
  • poll():移除并返回队列头部的元素。如果队列为空,则返回null
  • peek():查看队列头部的元素,但不移除它。如果队列为空,则返回null
  • add(E e):将元素添加到队列中。如果队列已满,则抛出IllegalStateException
  • remove():移除并返回队列头部的元素。如果队列为空,则抛出NoSuchElementException
代码示例:LinkedList作为Queue实现
import java.util.*;

public class LinkedListQueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();
        
        // 将元素添加到队列
        queue.offer("Java");
        queue.offer("Python");
        queue.offer("JavaScript");
        
        // 输出队列内容
        System.out.println("队列中的元素:" + queue);
        
        // 移除并返回队列头部的元素
        System.out.println("移除的元素:" + queue.poll());
        
        // 查看队列头部的元素但不移除
        System.out.println("队列头部的元素:" + queue.peek());
        
        // 输出队列内容
        System.out.println("移除后的队列:" + queue);
    }
}

输出结果:

队列中的元素:[Java, Python, JavaScript]
移除的元素:Java
队列头部的元素:Python
移除后的队列:[Python, JavaScript]

  在这个示例中,我们创建了一个LinkedList实例并将它用作Queue,利用offer()添加元素,poll()移除元素,peek()查看队列头部的元素。

2. PriorityQueue:基于优先队列的Queue实现

PriorityQueue是另一种常用的Queue实现类,它基于优先级堆(priority heap)实现,通常用于需要根据优先级排序的任务调度和元素管理。与LinkedList的先进先出不同,PriorityQueue中的元素是按自然顺序或根据指定的比较器进行排序的。

PriorityQueue的工作原理

PriorityQueue并不保证元素的顺序,它会根据优先级对元素进行排序。默认情况下,元素按其自然顺序(如数字升序、字母顺序)排序,或者根据提供的Comparator来排序。

  • offer(E e):将元素添加到队列中,元素会根据优先级进行排序。
  • poll():移除并返回队列头部的元素,返回的是优先级最高的元素。
  • peek():查看队列头部的元素,但不移除它,返回的是优先级最高的元素。
代码示例:PriorityQueue作为Queue实现
import java.util.*;

public class PriorityQueueExample {
    public static void main(String[] args) {
        Queue<Integer> queue = new PriorityQueue<>();
        
        // 添加元素到队列
        queue.offer(5);
        queue.offer(2);
        queue.offer(9);
        queue.offer(1);
        
        // 输出队列内容
        System.out.println("队列中的元素:" + queue);
        
        // 移除并返回队列头部的元素(优先级最高的元素)
        System.out.println("移除的元素:" + queue.poll());
        
        // 查看队列头部的元素但不移除
        System.out.println("队列头部的元素:" + queue.peek());
        
        // 输出移除后的队列
        System.out.println("移除后的队列:" + queue);
    }
}

输出结果:

队列中的元素:[1, 2, 9, 5]
移除的元素:1
队列头部的元素:2
移除后的队列:[2, 5, 9]

  在这个示例中,PriorityQueue根据自然顺序(升序)对元素进行排序,因此最小的元素1被移除,并且peek()方法返回当前最小的元素。

LinkedList与PriorityQueue的对比

特性 LinkedList PriorityQueue
排序顺序 按插入顺序排列(先进先出) 按优先级排序(默认升序或自定义排序)
元素重复 允许重复元素 允许重复元素
适用场景 适用于普通的队列应用,如消息队列 适用于任务调度、优先级队列等
时间复杂度 插入和删除操作的时间复杂度为O(1) 插入操作的时间复杂度为O(log n),删除操作的时间复杂度为O(log n)
线程安全性 非线程安全 非线程安全

总结

  • LinkedListLinkedListQueue接口的经典实现,使用链表结构来保存元素,适用于普通的队列操作(先进先出)。它在插入和删除操作上非常高效,尤其是在队列的两端操作时。

  • PriorityQueuePriorityQueue是基于优先级堆实现的Queue,它根据元素的优先级(通常是自然顺序或自定义比较器)进行排序。它适用于需要根据优先级进行任务调度的场景。

  • 选择合适的Queue实现类取决于你具体的应用场景:如果你需要保证元素按插入顺序处理,LinkedList是合适的;如果你需要根据优先级处理元素,PriorityQueue会更加适合。

Java的Queue接口和其实现类提供了多种灵活的选择,可以满足不同的需求。在多线程编程、任务调度和消息传递等应用中,理解这些实现类的特点将帮助你高效地处理队列操作。

举报

相关推荐

0 条评论