惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
爱范儿
爱范儿
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
Vercel News
Vercel News
aimingoo的专栏
aimingoo的专栏
T
Tailwind CSS Blog
罗磊的独立博客
B
Blog
博客园_首页
A
About on SuperTechFans
有赞技术团队
有赞技术团队
V
V2EX
U
Unit 42
I
InfoQ
IT之家
IT之家
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
The Cloudflare Blog
H
Help Net Security

博客园 - 五岳

JDK中使用的设计模式 Java的List.sort()排序方法源码理解 Cloud Agent 开发笔记(4):Skill 与 MCP 集成、项目后记 Cloud Agent 开发笔记(3):Web 交互与数据持久化 Cloud Agent 开发笔记(2):Agent 引擎与 Tool 体系 Cloud Agent 开发笔记(1):V1从跑通到放弃 单点登录系统思维导图与资料收集 阿里云DTS按业务场景批量迁移RDS MySQL表实战(下):迁移管理平台设计与实现 阿里云DTS按业务场景批量迁移RDS MySQL表实战(上):技术选型和API对接 分库分表数据源ShardingSphereDataSource的Connection元数据误用问题分析 Web层接口通用鉴权注解实践(基于JDK8) Feign框架中一处编码不合理导致的异常 解决Dify的Ollama插件添加模型时保存成功但模型为空的问题 深入研究使用DozerMapper复制List<Ojbect>前后元素类型不一致的问题 mybatis-config的mapUnderscoreToCamelCase配置生效方式和基本原理 封装CompletionService的并发任务分发器(优化版) 深入理解Mybatis分库分表执行原理 写代码被大语言模型坑之使用LocalDateTime比较两个时间差了几天 系统设计:消灭慢接口 Collectors.toMap的暗坑与避免方式 如丝般顺滑:DDD再实践之类目树管理 阿里云数仓Dataworks数据导出到文件step by step DDD实践反思 LeetCode组合总和I~IV和背包问题小结 Akka学习笔记
使用LinkedList实现队列和栈
五岳 · 2024-07-31 · via 博客园 - 五岳

LinkedList底层是由双向链表实现的,因此可以支持Queue和Stack。
本文讨论的实现基于JDK8源码。

实现Queue

LinkedList本身实现了Queue接口。

入队

方法签名 接口说明(JDK手册) 代码实现概括(JDK8)
boolean add(E e) 将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。 last处插入新节点
boolean offer(E e) 将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。 直接调用add()

出队

方法签名 接口说明(JDK手册) 代码实现概括(JDK8)
E element() 获取,但是不移除此队列的头。 取首元素,首元素为空则抛NoSuchElementException异常
E peek() 获取但不移除此队列的头;如果此队列为空,则返回 null。 取首元素,首元素为空则返回null
E poll() 获取并移除此队列的头,如果此队列为空,则返回 null。 调用unlinkFirst()移除首元素
E remove() 获取并移除此队列的头。 调用removeFirst(), 比unlinkFirst()多了一个校验,如果首元素为空则抛NoSuchElementException异常

实现Stack

Stack类已经比较老,官方已不推荐使用,推荐使用LinkedList替代。

Stack不推荐使用的原因

  • 扩展于Vector,Vetcor同样不被推荐;会暴露Vector的方法
  • 底层使用数组,有扩容性能问题
  • 方法中加了synchronized,性能问题,同时并不能完全保证并发场景下没有问题

栈操作

方法签名 接口说明(JDK手册) 代码实现概括(JDK8)
push(E e) 将元素推入此列表所表示的堆栈。 调用addFirst() (即linkFirst())
E peek() 获取但不移除此列表的头(第一个元素)。 取首元素,首元素为空则返回null
E poll() 获取并移除此列表的头(第一个元素) 调用unlinkFirst()移除首元素
E pop() 从此列表所表示的堆栈处弹出一个元素。 调用removeFirst(), 比unlinkFirst()多了一个校验,如果首元素为空则抛NoSuchElementException异常