Java集合Queue——针对实习面试

目录

  • Java集合Queue
    • Queue接口的特点是什么?
    • Queue和Deque的区别?
    • ArrayDeque和LinkedList的区别?
    • 什么是PriorityQueue?
    • 什么是BlockingQueue?

Java集合Queue

在这里插入图片描述

Queue接口的特点是什么?

Queue接口在Java中是一个特殊的集合,它具有以下特点:

  1. 先进先出(FIFO)原则
    Queue接口遵循FIFO(先进先出)的原则,这意味着元素被添加到队列的末尾,并从队列的前端移除。

  2. 元素访问
    Queue提供了对队列头部和尾部元素的访问。peek()方法允许查看队列头部的元素而不移除它,而element()方法也用于获取队头元素,但与peek()不同,如果队列为空,element()会抛出NoSuchElementException异常。

  3. 添加和移除元素
    Queue接口提供了add(E e)remove()方法来添加和移除元素,这些方法在队列满或空时会抛出异常。为了更安全地处理这些情况,Queue还提供了offer(E e)poll()方法,它们在无法添加或移除元素时返回falsenull,而不是抛出异常。

  4. 容量限制
    某些Queue实现(如ArrayDequeLinkedBlockingQueue)有容量限制,而其他实现(如LinkedList)则没有容量限制。

  5. 双端队列(Deque)
    Queue可以扩展为Deque接口,这允许元素从队列的两端进行插入和移除操作,使得Queue既可以作为队列使用,也可以作为栈使用。

  6. 线程安全性
    Queue接口本身不提供线程安全的保证,但Java提供了BlockingQueue接口,它是Queue的子接口,提供了线程安全的队列实现,适用于多线程环境。

  7. 泛型支持
    Queue接口支持泛型,这意味着你可以指定队列中元素的类型,从而在编译时期提供类型安全。

  8. 优先级队列
    Queue的一个子接口PriorityQueue提供了优先级队列的实现,元素根据其自然顺序或通过提供的Comparator进行排序。

  9. 非阻塞和阻塞操作
    对于非阻塞操作,Queue提供了poll()offer()方法;对于阻塞操作,BlockingQueue提供了take()put()方法,这些方法在无法进行操作时会阻塞调用线程。

了解Queue接口的这些特点对于在Java中正确使用队列至关重要,无论是在单线程还是多线程环境中。

Queue和Deque的区别?

QueueDeque都是Java集合框架中的接口,它们都可以用来存储元素,但它们之间存在一些关键的区别:

  1. 顺序不同

    • Queue接口是先进先出(FIFO)的数据结构,元素从队尾添加,从队头移除。
    • Deque接口是双端队列,支持从两端添加和移除元素,既可以实现FIFO(队列)的行为,也可以实现后进先出(LIFO,即栈)的行为。
  2. 方法不同

    • Queue提供了add, offer, remove, poll, element, peek等方法。
    • Deque除了包含Queue的所有方法外,还提供了addFirst, addLast, offerFirst, offerLast, pollFirst, pollLast, removeFirst, removeLast, getFirst, getLast, peekFirst, peekLast等方法,这些方法允许从两端进行操作。
  3. 行为不同

    • Queue的行为更受限,只能从队头移除元素,从队尾添加元素。
    • Deque的行为更灵活,可以作为队列、栈或两者的组合来使用。
  4. 实现类不同

    • Queue的常见实现类有LinkedList, PriorityQueue, ArrayDeque(也是Deque的实现)。
    • Deque的常见实现类有ArrayDequeLinkedList
  5. 性能考虑

    • 对于QueueLinkedList是一个常见的选择,因为它允许快速的插入和删

ArrayDeque和LinkedList的区别?

ArrayDequeLinkedList都是Java中的双端队列(Deque)实现,但它们在内部数据结构和性能特性上有所不同。以下是它们的主要区别:

  1. 内部数据结构

    • ArrayDeque是基于动态数组实现的,这意味着它使用一个可扩展的数组来存储元素。
    • LinkedList是基于双向链表实现的,每个元素都包含对前一个和后一个元素的引用。
  2. 随机访问性能

    • ArrayDeque支持快速的随机访问,因为它的元素存储在数组中,可以通过索引直接访问。
    • LinkedList不支持快速随机访问,因为它需要从头或尾开始遍历链表才能到达特定位置。
  3. 内存占用

    • ArrayDeque的内存占用通常比LinkedList少,因为它不需要为每个元素存储额外的前驱和后继指针。
    • LinkedList的每个节点都需要额外的空间来存储两个指针(指向前一个和后一个元素),这增加了内存开销。
  4. 扩容操作

    • ArrayDeque在需要时会进行扩容操作,这涉及到创建一个新的数组并复制旧数组中的元素,这是一个相对昂贵的操作,但通常比链表操作快。
    • LinkedList不需要扩容操作,因为它总是能够通过创建新的节点来动态地添加元素。
  5. 插入和删除性能

    • ArrayDeque在两端的插入和删除操作上通常比LinkedList快,因为它不需要像链表那样维护前后节点的链接。
    • LinkedList在两端的插入和删除操作上也很快,因为它只需要改变几个节点的指针,但随机位置的插入和删除操作会慢一些。
  6. 线程安全性

    • 两者都不是线程安全的,但可以通过Collections.synchronizedDeque方法来创建线程安全的ArrayDequeLinkedList
  7. 使用场景

    • ArrayDeque适合于需要快速随机访问元素的场景,以及作为栈或队列使用时,元素数量相对固定的情况。
    • LinkedList适合于需要在列表中间频繁插入和删除元素的场景,或者作为队列使用时,元素数量频繁变化的情况。
  8. 实现的接口

    • ArrayDeque实现了Deque接口和Queue接口。
    • LinkedList实现了List接口、Deque接口和Queue接口。
  9. 性能特性

    • ArrayDeque在并发环境下的性能通常优于LinkedList,因为它的扩容操作和随机访问操作更快。

在选择ArrayDequeLinkedList时,需要根据具体的应用场景和性能要求来决定使用哪一个。如果需要频繁的随机访问,或者队列的大小相对固定,ArrayDeque可能是更好的选择。如果需要在列表中间频繁地进行插入和删除操作,或者队列的大小频繁变化,LinkedList可能更合适。

什么是PriorityQueue?

PriorityQueue是Java中的一个类,它实现了Queue接口,并且是java.util包的一部分。以下是PriorityQueue的一些关键特性:

  1. 排序

    • PriorityQueue是一个优先级队列,其中元素根据它们的自然顺序或者通过提供的Comparator进行排序。队列的头部(队首)总是队列中具有最高优先级的元素。
  2. 无界队列

    • 默认情况下,PriorityQueue是一个无界队列,这意味着它可以无限增长,除非内存不足。
  3. 线程不安全

    • PriorityQueue不是线程安全的。如果需要线程安全的优先级队列,可以使用PriorityBlockingQueue
  4. 元素唯一性

    • PriorityQueue不允许插入null元素,并且根据使用的比较器(Comparator),可能也不支持元素重复。
  5. 插入和删除操作

    • PriorityQueue提供了offer(E e)方法来添加元素,和poll()方法来移除并返回队列头部的元素。这些操作的时间复杂度是O(log(n))
  6. 元素访问

    • 可以通过peek()方法来查看但不移除队列头部的元素,如果队列为空,则返回null
  7. 自定义排序

    • 在创建PriorityQueue实例时,可以提供一个Comparator来定义元素的排序规则。
  8. 迭代器

    • PriorityQueue提供了一个迭代器,允许按优先级顺序遍历队列中的元素。
  9. 堆的实现

    • PriorityQueue通常使用堆数据结构(通常是二叉堆)来存储元素,以保证高效的插入和删除操作。
  10. 使用场景

    • PriorityQueue适用于需要根据优先级处理元素的场景,例如任务调度、事件驱动模拟等。

下面是一个简单的PriorityQueue使用示例:

import java.util.PriorityQueue;public class PriorityQueueExample {public static void main(String[] args) {PriorityQueue<Integer> pq = new PriorityQueue<>(); // 默认自然顺序排序pq.offer(3);pq.offer(1);pq.offer(2);System.out.println(pq.poll()); // 输出 1System.out.println(pq.poll()); // 输出 2System.out.println(pq.poll()); // 输出 3}
}

在这个例子中,整数被添加到优先级队列中,并按照自然顺序(升序)排序。使用poll()方法可以按优先级顺序移除元素。

什么是BlockingQueue?

BlockingQueue是Java并发包java.util.concurrent中的一个接口,它继承自java.util.Queue接口。BlockingQueue提供了线程安全的队列实现,主要用于多线程之间的数据交换。以下是BlockingQueue的一些关键特性:

  1. 线程安全

    • BlockingQueue的所有实现都是线程安全的,这意味着它们可以被多个线程安全地访问而不需要额外的同步。
  2. 阻塞操作

    • BlockingQueue提供了阻塞的插入(put)和移除(take)操作。当队列满时,插入操作会阻塞,直到队列中有空间;当队列空时,移除操作会阻塞,直到队列中有元素。
  3. 可选的公平性

    • 一些BlockingQueue实现(如LinkedBlockingQueue)允许构造函数中指定公平性(fairness)。如果设置为公平性模式,线程将根据它们等待的时间来访问队列,而不公平的队列可能允许饥饿现象发生。
  4. 容量限制

    • 某些BlockingQueue实现(如ArrayBlockingQueueLinkedBlockingQueue)有固定容量,而其他实现(如LinkedBlockingQueue的无界版本)可以有无限容量。
  5. 非阻塞操作

    • 除了阻塞操作外,BlockingQueue还提供了非阻塞的插入(offer)和移除(poll)操作,这些操作在无法立即完成时会立即返回。
  6. 支持超时

    • BlockingQueue提供了带有超时的插入(offer(E e, long timeout, TimeUnit unit))和移除(poll(long timeout, TimeUnit unit))操作,允许线程在等待一定时间后放弃。
  7. 支持中断

    • BlockingQueue的阻塞操作可以通过中断来响应中断信号,允许线程在等待时响应中断,提高程序的响应性。
  8. 常见实现

    • ArrayBlockingQueue:一个由数组支持的有界阻塞队列。
    • LinkedBlockingQueue:一个由链表支持的可选有界阻塞队列。
    • PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
    • SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等待一个移除操作,反之亦然。
  9. 使用场景

    • BlockingQueue适用于生产者-消费者问题,其中生产者线程将元素放入队列,消费者线程从队列中取出元素。

下面是一个简单的BlockingQueue使用示例:

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;public class BlockingQueueExample {public static void main(String[] args) throws InterruptedException {BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();// 生产者线程Thread producer = new Thread(() -> {try {queue.put(1); // 将元素放入队列System.out.println("Produced: 1");} catch (InterruptedException e) {Thread.currentThread().interrupt();}});// 消费者线程Thread consumer = new Thread(() -> {try {int element = queue.take(); // 从队列中取出元素System.out.println("Consumed: " + element);} catch (InterruptedException e) {Thread.currentThread().interrupt();}});producer.start();consumer.start();producer.join();consumer.join();}
}

在这个例子中,生产者线程将一个元素放入LinkedBlockingQueue,而消费者线程从队列中取出该元素。如果队列为空,take方法将阻塞消费者线程,直到队列中有元素可用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/13143.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【支付宝崩了】复盘

一、背景 2024年11月11日&#xff0c;#支付宝崩了#冲上微博热搜第一 部分网友反映支付宝 App无法正常使用&#xff0c;他们遇到了同一笔订单被扣款三次、余额宝转账至余额后余额显示为0、线下支付后商家未收到款项但银行卡已被扣款等问题。 此外&#xff0c;有网友称支付…

丹摩征文活动|FLUX.1+ComfyUI的详细部署以及实验总结

公主请阅 1. FLUX.1的简介2. 部署过程创建资源ComfyUI的部署操作部署FLUX.1 如何使用&#xff1f;实验总结&#xff1a;环境搭建与工具安装实验步骤实验结果分析总结 1. FLUX.1的简介 FLUX.1 是由黑森林实验室开发的图像生成工具&#xff0c;分为三个版本&#xff1a; FLUX-1-…

基于STM32的智能仓库管理系统设计

引言 本项目基于STM32微控制器设计了一个智能仓库管理系统&#xff0c;通过集成多个传感器模块和控制设备&#xff0c;实现对仓库环境和物资管理的自动化监控。该系统能够实时监测仓库内的温湿度、烟雾浓度等参数&#xff0c;并且通过红外传感器监控人员出入&#xff0c;结合R…

206面试题(47~60)

208道Java面试题 47~60 **208道Java面试题****47. 在 Java 程序中怎么保证多线程的运行安全&#xff1f;****48. 多线程中 synchronized 锁升级的原理是什么&#xff1f;****49. 什么是死锁&#xff1f;****50. 怎么防止死锁&#xff1f;****51. ThreadLocal 是什么&#xff1f…

MySQl基础----Linux下数据库的密码和数据库的存储引擎(内附 实操图和手绘图 简单易懂)

绪论​ 涓滴之水可磨损大石&#xff0c;不是由于他力量强大&#xff0c;而是由于昼夜不舍地滴坠。 只有勤奋不懈地努力&#xff0c;才能够获得那些技巧。 ——贝多芬。新开MySQL篇章&#xff0c;本章非常基础&#xff0c;但同时需要一定的Linux基础&#xff0c;所以假若你没学习…

番外篇 | 关于YOLO11算法的改进点总结

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在2024年9月27日盛大举行的YOLO Vision 2024活动上&#xff0c;Ultralytics公司震撼发布了YOLO系列的最新成员—YOLO11。作为Ultralytics YOLO系列实时目标检测器的最新迭代&#xff0c;YOLO11凭借尖端的准确性、速度和效率…

增长放缓,跨境电商如何以“体验”撬动高转化和高复购?

增长放缓&#xff0c; 跨境电商步入发展新周期 伴随着疫情红利的逐渐收缩&#xff0c;跨境电商市场从野蛮高速增长回归理性&#xff0c;步入新的发展周期&#xff0c;增幅放缓成为新常态。根据eMarketer的统计数据&#xff0c;全球跨境电商销售增长从2020年的26.7%下跌至2022年…

2024“龙信杯“电子数据取证竞赛——计算机取证题目Writeup

以下内容是2024年“龙信杯”电子数据取证竞赛计算机取证题目的答案与解题思路 前置 前置发现电脑中有EFS加密文件&#xff0c;故使用仿真软件保持原有密码进行仿真 1.分析计算机检材&#xff0c;嫌疑人在将其侵公数据出售前在Pycharm中进行了AES加密&#xff0c;用于加密的key…

Linux学习_12

第十一章 管理Linux软件包和进程 主要包括源码下载安装软件&#xff0c;PRM管理工具&#xff0c;YUM/DNF管理工具 源码下载安装软件 源码文件&#xff1a;是指包含计算机程序源代码的文本文件。源代码是用特定编程语言编写的人类可读指令&#xff0c;它描述了计算机程序的逻辑、…

2024年Python最新下载安装教程,附详细图文,持续更新

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是Python3 的下载安装教程&#xff0c;适用于所有 Python3 版本&#xff0c;感兴趣的可以看一下 文章目录 简介一、Python的下载1 网盘下载地址 (下载速度比较快&#xff0c;推荐&#xff09;2 官网下载地址 二、…

JAVA同城服务顺风车预约车拼车系统源码支持小程序+公众号+H5

JAVA同城服务顺风车预约车拼车系统源码&#xff0c;全面支持小程序、公众号及H5平台&#xff0c;精准定位于解决城市出行痛点&#xff0c;满足用户多样化、灵活化的出行需求。市场分析显示&#xff0c;该系统凭借便捷的预约拼车功能&#xff0c;有效缓解城市交通压力&#xff0…

126.WEB渗透测试-信息收集-ARL(17)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;125.WEB渗透测试-信息收集-ARL&#xff08;16&#xff09; POC信息里面有一些集成的poc …

什么是 ISP:了解互联网服务提供商的作用

一、ISP 基础知识 从本质上讲&#xff0c;ISP 提供两项主要服务&#xff1a;互联网接入和互联网传输。互联网接入是指使用户能够连接到互联网的物理和逻辑连接&#xff0c;通常通过调制解调器、路由器或其他网络设备。此连接可以是有线的&#xff08;例如通过 DSL、光纤或电缆…

Trace——下一代自动微分工具,优化AI系统设计

人工智能咨询培训老师叶梓 转载标明出处 在自动化设计和更新AI系统&#xff0c;如编码助手、机器人和副驾驶等领域&#xff0c;优化问题的研究显得尤为重要。传统的自动微分框架&#xff0c;例如PyTorch&#xff0c;虽然能够高效地优化可微分系统&#xff0c;但在面对一般计算…

天猫商品详情数据API接口简介

随着电子商务的飞速发展&#xff0c;各大电商平台都在积极开发和完善自己的数据接口&#xff0c;以便为商家和消费者提供更加便捷、高效的服务。天猫作为阿里巴巴旗下的重要电商平台&#xff0c;其商品详情数据接口是商家获取商品信息、进行数据分析的重要工具。联讯数据将详细…

unity 玩家和炸弹切线计算方式

脚本挂在炸弹上&#xff01; using System.Collections; using System.Collections.Generic; using UnityEngine;public class TargetDetaction : MonoBehaviour {private Transform PlayerTF;private Transform bomb;private float radius;private string Player "Play…

【Linux】————信号

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux 创作时间 &#xff1a;2024年11月12日 信号和信号量 首先说明这两者之间没有任何关系 信号&#xff1a;信号是在软件层次对中断机制的一种模拟&#xff0c;是一种异步通知机制&#xff0c;用于通知进程发生…

【数据治理】你知道数据加密和脱敏技术?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

python:用 sklearn 构建 K-Means 聚类模型

pip install scikit-learn 或者 直接用 Anaconda3 sklearn 提供了 preprocessing 数据预处理模块、cluster 聚类模型、manifold.TSNE 数据降维模块。 编写 test_sklearn_3.py 如下 # -*- coding: utf-8 -*- """ 使用 sklearn 构建 K-Means 聚类模型 "&…

10款PDF合并工具的使用体验与推荐!!!

在如今的信息洪流中&#xff0c;我们几乎每个人都被淹没在大量的数字文档之中。无论是学生、教师还是职场人士&#xff0c;我们都需要高效地管理和处理这些文档。而PDF文件&#xff0c;凭借其跨平台的稳定性和通用性&#xff0c;成了最常用的文档格式之一。我们经常需要处理、编…