Java Queue

来自牛奶河Wiki
阿奔讨论 | 贡献2024年4月9日 (二) 14:44的版本 →‎接口实现类
跳到导航 跳到搜索

队列(Queue)是一种非常重要的数据结构。广泛应用于多线程、网络通信、缓存、消息队列等场景。

Queue 能够高效地实现元素的插入、删除以及元素的存储,在多线程场景中安全地实现元素的读写操作。遍历操作效率较低,元素的顺序固定。

应用场景

  • 消息队列: 在分布式系统中,消息队列是一种常用的通信方式。生产者向队列中添加消息,消费者从队列中取出消息进行处理。如:ActiveMQ、RabbitMQ 等消息队列服务均使用了队列的相关技术
  • 线程池: 通常使用 BlockingQueue 来存储待执行的任务。当线程池中的线程已经全部分配任务时,新的任务将会被阻塞,直到有线程可用为止。如:ThreadPoolExecutor 使用 BlockingQueue 来存储待执行的任务
  • 缓存: 通常使用 LinkedList 或 ConcurrentLinkedQueue 来实现。缓存存储的是最近访问过的元素,当缓存已满时,新的元素会将最旧的元素移除

接口实现类

Queue 接口继承自 Collection 接口,添加了一些队列相关的方法。Queue 的实现类有多种,包括 LinkedList、ArrayBlockingQueue、PriorityQueue、ConcurrentLinkedQueue 等。

  • LinkedList: 双向链表实现类。实现了 Deque 接口(Queue接口的子接口),因此 LinkedList 可以被视为 Queue 的一种实现。插入、删除操作效率高
  • ArrayBlockingQueue: 基于数组的有界阻塞队列实现类,长度固定的环形数组。具有先进先出的队列特性,多线程安全,可以指定等待时间,当队列满或空时,线程将被阻塞
  • PriorityQueue: 基于堆结构的带优先级的队列实现类。根据元素的排序规则进行排序,每次出队时都会返回当前队列中最小(或最大)的元素。插入、删除效率高
  • ConcurrentLinkedQueue: 基于链表的无界并发队列实现类。多线程安全,能够高效地处理高并发场景。不支持阻塞操作,不保证元素的排序

类方法

  • offer(E e): 将元素e添加到队列尾部,返回值(true/false)表示添加操作是否成功(add)
  • poll(): 移除队列头部的元素并返回该元素,如果队列为空,则返回 null(remove)
  • peek(): 返回队列头部的元素,如果队列为空,则返回 null(element)