当前位置: 首页 > news >正文

java基础-ArrayDeque

ArrayDeque是Java 集合框架中的一个类,它是一个基于可调整大小的循环数组实现的双端队列

是Deque接口的实现类之一

继承关系:

Iterable (接口) ↓ Collection (接口) ↓ Queue (接口) ↓ Deque (接口) ↓ ┌─────────────────┐ │ ArrayDeque (类) │ ← 具体实现 └─────────────────┘

主要特点:

1.数据结构

  • 底层使用动态数组(循环数组)实现

  • 允许从两端高效地添加/移除元素

  • 内存连续,访问速度快

2.核心特性

  • 线程不安全(非同步)

  • 不允许存储 null 元素

  • 初始容量默认为16,自动扩容(2倍)

  • 既可作为栈(Stack)使用,也可作为队列(Queue)使用

  • 性能通常优于 LinkedList(作为队列/栈时)

常用方法:

队列操作(FIFO)

ArrayDeque<String> deque = new ArrayDeque<>(); // 添加元素到队尾 deque.offer("A"); // 推荐 deque.add("B"); // 可能抛出异常 deque.offerLast("C"); // 明确指定队尾 // 从队首移除并返回 String first = deque.poll(); // 返回null如果为空 String first2 = deque.remove(); // 抛出异常如果为空 String first3 = deque.pollFirst(); // 查看队首(不移除) String peek = deque.peek(); String peek2 = deque.peekFirst();

栈操作(LIFO)

// 作为栈使用 ArrayDeque<String> stack = new ArrayDeque<>(); // 压栈 stack.push("A"); // 添加到队首 stack.addFirst("B"); // 弹栈 String top = stack.pop(); // 移除队首 String top2 = stack.pollFirst(); // 查看栈顶 String peek = stack.peek(); String peek2 = stack.peekFirst();

双端队列操作

// 队首操作 deque.addFirst("First"); deque.offerFirst("First"); deque.removeFirst(); deque.pollFirst(); // 队尾操作 deque.addLast("Last"); deque.offerLast("Last"); deque.removeLast(); deque.pollLast();

性能对比

操作ArrayDequeLinkedList
添加/删除(两端)O(1)*O(1)
随机访问O(1)O(n)
内存使用更紧凑更多(节点开销)
遍历速度更快(缓存友好)较慢

注意:ArrayDeque的O(1)是分摊时间复杂度,扩容时会有额外开销

使用场景推荐:

推荐使用 ArrayDeque:

  1. 作为栈使用(替代过时的 Stack 类)

    // 推荐 Deque<Integer> stack = new ArrayDeque<>(); // 不推荐(已过时) Stack<Integer> oldStack = new Stack<>();
  2. 作为队列使用

    Queue<String> queue = new ArrayDeque<>();
  3. 需要高效的双端操作

    Deque<Integer> deque = new ArrayDeque<>();

不适合的场景:

  1. 需要线程安全(考虑使用 ConcurrentLinkedDeque)

  2. 需要存储 null 元素

  3. 需要频繁在中间插入/删除

示例代码:

public class ArrayDequeExample { public static void main(String[] args) { // 1. 作为队列 Queue<Integer> queue = new ArrayDeque<>(); queue.offer(1); queue.offer(2); System.out.println(queue.poll()); // 1 // 2. 作为栈 Deque<Integer> stack = new ArrayDeque<>(); stack.push(1); stack.push(2); System.out.println(stack.pop()); // 2 // 3. 作为双端队列 ArrayDeque<String> deque = new ArrayDeque<>(); deque.addFirst("First"); deque.addLast("Last"); System.out.println(deque); // [First, Last] } }

注意事项:

  1. 线程安全:ArrayDeque 不是线程安全的,多线程环境下需要外部同步

  2. 容量限制:最大容量是Integer.MAX_VALUE - 8

  3. 迭代器:迭代器是 fail-fast 的

  4. 性能:在大多数场景下,作为栈/队列使用时性能优于 LinkedList

总结:ArrayDeque 是 Java 中实现队列和栈的首选类,它提供了高效的性能、简洁的API,并且比传统的Stack类更现代、更安全。

http://www.cnnetsun.cn/news/117199.html

相关文章:

  • Uppy智能文件过滤:从混乱上传到精准控制的革命性方案
  • Nginx性能优化终极指南:Linux服务器加速实战技巧
  • AI销售自动化与客户管理的最佳获客软件选择--VertGrow AI销冠
  • Naive UI 图片预览实用技巧:打造专业画廊效果的高效方法
  • 前沿速递 | Adv. Eng. Mater.:基于LPBF与压力渗透的FeSi2.9-Bakelite多功能复合材料设计与性能调控
  • Mermaid Live Editor 终极指南:实时图表编辑的完整解决方案
  • Drawnix白板工具:用代码思维重塑图形设计工作流
  • Monaco Editor代码提示响应优化实战指南
  • 下一代前端开发:用Next.js与大模型AI,零代码解锁你的智能助手
  • 跨越浏览器壁垒:Skyvern如何实现自动化脚本的通用兼容性
  • 应用现代化 | 金融智能风控的新标尺——《金融级智能应用能力要求 风控场景》标准正式发布
  • Undetectable接入亮数据代理ip做自媒体矩阵
  • 如何用lidR包3步完成激光雷达林业精准分析:从点云到决策的完整指南
  • 初识操作系统
  • Android端AI模型部署终极指南:从入门到精通
  • RuoYi-Vue3企业级管理系统:现代化开发框架实战指南
  • MCP协议驱动企业级AI集成:芋道源码的智能化升级实践
  • 终极指南:使用gsplat.js实现高性能3D高斯点云渲染
  • 把CNN和SVR捏在一起做预测这事儿,乍听有点玄乎,实操起来倒挺有意思。咱们今天不整那些虚头巴脑的理论,直接上手撸代码。先甩个模型结构出来镇楼
  • Memobase完整安装指南:构建AI长期记忆系统的7个关键步骤
  • Faiss HNSW性能瓶颈突破:5步诊断与3倍提速优化实战
  • 5个立竿见影的wgpu性能优化技巧:让你的Rust图形应用帧率翻倍
  • 1000 人并发 + 4K 高清,3 大行业案例见证协作效率翻倍
  • 字符串的拼接函数:strcat()
  • GraphRAG-Local-UI终极指南:本地知识图谱构建与智能查询完整教程
  • Messari:Flow 生态 2025 年 Q3 发展概览
  • Draft.js工具栏深度定制:构建企业级富文本编辑器的完整实践
  • 下一个版本EmotiVoice将带来哪些惊喜?
  • 明诺多功能全自动洗地机,适用于超市、地库及商场清洁需求
  • 最近网上爆火的Flowith AI是啥?能否成为下一代AI Agent产品?