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

Java集合入门必看:ArrayList与LinkedList常用方法详解(附实战案例)

在Java开发中集合是日常使用频率极高的工具而ArrayList和LinkedList作为List接口的两大核心实现类分别适用于不同的业务场景。很多初学者在使用时常常混淆两者的方法用法不清楚何时该用ArrayList、何时该用LinkedList也容易在方法调用时踩坑。本文将详细拆解ArrayList与LinkedList的常用方法结合可直接运行的实战案例清晰讲解每个方法的功能、用法和注意事项同时补充两者的核心差异帮你快速掌握两种集合的使用技巧无论是入门学习还是日常开发都能轻松应对。一、ArrayList基于动态数组的高效查询集合ArrayList底层基于动态数组实现核心优势是查询效率高通过索引直接访问元素但插入、删除元素时效率较低需移动后续元素适合查询频繁、增删较少的场景如数据展示、批量查询。以下是ArrayList最常用的12个方法每个方法都搭配简洁易懂的实战案例可直接复制运行快速掌握用法。1. 元素添加add() 方法的两种核心用法add() 是ArrayList最基础的添加元素方法分为“尾部添加”和“指定位置添加”两种适配不同的添加场景。1add(Object element)向集合尾部添加指定元素无需指定索引添加成功后返回true。import java.util.ArrayList; public class ArrayListTest { public static void main(String[] args) { // 初始化ArrayList通过泛型指定集合中仅存储字符串类型元素 ArrayListString list new ArrayList(); // 向集合尾部添加元素 list.add(Java); list.add(Python); list.add(MySQL); // 打印集合直接输出所有元素 System.out.println(添加元素后的集合 list); // 输出[Java, Python, MySQL] } }2add(int index, Object element)在集合指定索引位置插入元素原索引及后续元素会自动向后移动索引从0开始。import java.util.ArrayList; public class ArrayListTest { public static void main(String[] args) { ArrayListString list new ArrayList(); list.add(Java); list.add(MySQL); System.out.println(插入前 list); // 输出[Java, MySQL] // 在索引1的位置插入Python原索引1的MySQL自动后移 list.add(1, Python); System.out.println(插入后 list); // 输出[Java, Python, MySQL] } }注意插入索引不能超出集合当前长度最大可等于长度即尾部插入否则会抛出IndexOutOfBoundsException索引越界异常。2. 元素查询size() 与 get() 搭配使用查询是ArrayList的核心优势通过size()获取集合长度get()获取指定索引的元素两者搭配可实现集合的遍历与单个元素查询。1size()返回集合中元素的实际个数注意与数组的length区分数组length是固定长度集合size是动态变化的。2get(int index)返回指定索引位置的元素索引从0开始超出范围会抛出索引越界异常。import java.util.ArrayList; public class ArrayListTest { public static void main(String[] args) { ArrayListString list new ArrayList(); list.add(Java); list.add(Python); list.add(MySQL); // 获取集合长度 int size list.size(); System.out.println(集合元素个数 size); // 输出3 // 获取指定索引的元素 String element list.get(1); System.out.println(索引1对应的元素 element); // 输出Python } }3. 元素修改set(int index, Object element)set() 方法用于替换指定索引位置的元素替换后会返回被替换的旧元素原集合长度不变。import java.util.ArrayList; public class ArrayListTest { public static void main(String[] args) { ArrayListString list new ArrayList(); list.add(Java); list.add(Python); list.add(MySQL); System.out.println(修改前 list); // 输出[Java, Python, MySQL] // 替换索引2的元素将MySQL替换为Redis返回被替换的旧元素 String oldElement list.set(2, Redis); System.out.println(被替换的旧元素 oldElement); // 输出MySQL System.out.println(修改后 list); // 输出[Java, Python, Redis] } }4. 元素判断isEmpty() 与 contains()两个方法均用于判断集合状态isEmpty()判断集合是否为空contains()判断集合是否包含指定元素返回值均为boolean类型。1isEmpty()集合为空元素个数为0返回true否则返回false。2contains(Object o)集合中包含指定元素equals()方法判断相等返回true否则返回false。import java.util.ArrayList; public class ArrayListTest { public static void main(String[] args) { ArrayListString list new ArrayList(); list.add(Java); list.add(Python); // 判断集合是否为空 boolean isEmpty list.isEmpty(); System.out.println(集合是否为空 isEmpty); // 输出false // 判断集合是否包含指定元素 boolean hasPython list.contains(Python); boolean hasRedis list.contains(Redis); System.out.println(集合包含Python hasPython); // 输出true System.out.println(集合包含Redis hasRedis); // 输出false } }5. 元素删除remove() 方法的两种核心用法remove() 方法用于删除集合中的元素分为“按索引删除”和“按元素删除”两种删除后后续元素会自动向前移动。1remove(int index)删除指定索引位置的元素返回被删除的元素索引超出范围会抛出异常。2remove(Object o)删除集合中第一次出现的指定元素删除成功返回true无该元素返回false。import java.util.ArrayList; public class ArrayListTest { public static void main(String[] args) { ArrayListString list new ArrayList(); list.add(Java); list.add(Python); list.add(Python); list.add(MySQL); System.out.println(删除前 list); // 输出[Java, Python, Python, MySQL] // 按索引删除删除索引1的元素 String removeByIndex list.remove(1); System.out.println(按索引删除的元素 removeByIndex); // 输出Python System.out.println(按索引删除后 list); // 输出[Java, Python, MySQL] // 按元素删除删除第一次出现的Python boolean removeByElement list.remove(Python); System.out.println(按元素删除是否成功 removeByElement); // 输出true System.out.println(按元素删除后 list); // 输出[Java, MySQL] } }6. 集合清空clear()clear() 方法用于清空集合中的所有元素清空后集合长度变为0但集合对象本身依然存在区别于集合赋值为null。import java.util.ArrayList; public class ArrayListTest { public static void main(String[] args) { ArrayListString list new ArrayList(); list.add(Java); list.add(Python); System.out.println(清空前 list); // 输出[Java, Python] // 清空集合 list.clear(); System.out.println(清空后是否为空 list.isEmpty()); // 输出true System.out.println(清空后集合 list); // 输出[] } }7. 集合遍历iterator() 迭代器与增强for循环遍历是集合的常用操作ArrayList支持两种简洁的遍历方式迭代器iterator()和增强for循环foreach无需手动管理索引避免索引越界问题。1iterator()返回迭代器对象通过hasNext()判断是否有下一个元素next()获取下一个元素。2增强for循环语法简洁直接遍历集合中的每一个元素无需关心索引。import java.util.ArrayList; import java.util.Iterator; public class ArrayListTest { public static void main(String[] args) { ArrayListString list new ArrayList(); list.add(Java); list.add(Python); list.add(MySQL); // 1. 迭代器遍历 System.out.println(迭代器遍历); IteratorString iterator list.iterator(); while (iterator.hasNext()) { // 判断是否有下一个元素 String element iterator.next(); // 获取下一个元素 System.out.println(element); } // 2. 增强for循环遍历 System.out.println(增强for循环遍历); for (String element : list) { System.out.println(element); } } }二、LinkedList基于双向链表的高效增删集合LinkedList底层基于双向链表实现核心优势是增删效率高无需移动元素仅需修改链表指针但查询效率较低需从头/尾遍历查找元素适合增删频繁、查询较少的场景如队列、栈、消息队列。LinkedList继承了List接口除了支持ArrayList的大部分方法还提供了针对链表头、尾的专属方法以下是其常用方法的详细讲解。1. 元素添加4种核心添加方法LinkedList的添加方法比ArrayList更丰富除了尾部添加、指定位置添加还支持头部添加、尾部添加的专属方法操作更便捷。1add(Object element)尾部添加元素与ArrayList用法一致。2add(int index, Object element)指定位置插入元素与ArrayList用法一致。3addFirst(Object element)向链表头部添加元素专属方法。4addLast(Object element)向链表尾部添加元素专属方法与add()效果一致。import java.util.LinkedList; public class LinkedListTest { public static void main(String[] args) { LinkedListInteger linkedList new LinkedList(); // 尾部添加元素 linkedList.add(10); linkedList.add(20); // 头部添加元素 linkedList.addFirst(5); // 尾部添加元素与add()一致 linkedList.addLast(30); // 指定位置插入元素索引2 linkedList.add(2, 15); System.out.println(添加元素后的链表 linkedList); // 输出[5, 10, 15, 20, 30] } }2. 元素查询3种核心查询方法LinkedList的查询方法除了get(int index)还提供了头部、尾部元素的专属查询方法无需遍历直接获取头/尾元素效率更高。1get(int index)根据索引获取元素需从头/尾遍历效率较低。2getFirst()获取链表头部元素专属方法无需遍历。3getLast()获取链表尾部元素专属方法无需遍历。import java.util.LinkedList; public class LinkedListTest { public static void main(String[] args) { LinkedListInteger linkedList new LinkedList(); linkedList.add(10); linkedList.add(20); linkedList.add(30); linkedList.add(40); // 根据索引获取元素 int indexElement linkedList.get(2); // 获取头部元素 int firstElement linkedList.getFirst(); // 获取尾部元素 int lastElement linkedList.getLast(); System.out.println(索引2的元素 indexElement); // 输出30 System.out.println(头部元素 firstElement); // 输出10 System.out.println(尾部元素 lastElement); // 输出40 } }3. 元素查询contains() 方法与ArrayList的contains()用法一致判断链表中是否包含指定元素返回boolean类型底层需遍历链表查找。import java.util.LinkedList; public class LinkedListTest { public static void main(String[] args) { LinkedListInteger linkedList new LinkedList(); linkedList.add(10); linkedList.add(20); linkedList.add(30); boolean has20 linkedList.contains(20); boolean has50 linkedList.contains(50); System.out.println(链表包含20 has20); // 输出true System.out.println(链表包含50 has50); // 输出false } }4. 元素修改set(int index, Object element)与ArrayList的set()用法完全一致替换指定索引位置的元素返回被替换的旧元素需注意索引范围。import java.util.LinkedList; public class LinkedListTest { public static void main(String[] args) { LinkedListInteger linkedList new LinkedList(); linkedList.add(10); linkedList.add(20); linkedList.add(30); System.out.println(修改前 linkedList); // 输出[10, 20, 30] // 替换索引1的元素将20替换为25 int oldElement linkedList.set(1, 25); System.out.println(被替换的旧元素 oldElement); // 输出20 System.out.println(修改后 linkedList); // 输出[10, 25, 30] } }5. 元素删除5种核心删除方法LinkedList的删除方法同样丰富除了按索引、按元素删除还提供了头部、尾部元素的专属删除方法操作便捷且效率高。1remove()无参数默认删除链表头部元素专属方法。2remove(int index)按索引删除元素返回被删除的元素。3remove(Object o)按元素删除删除第一次出现的指定元素返回boolean类型。4removeFirst()删除并返回链表头部元素专属方法与remove()效果一致。5removeLast()删除并返回链表尾部元素专属方法。import java.util.LinkedList; public class LinkedListTest { public static void main(String[] args) { LinkedListInteger linkedList new LinkedList(); linkedList.add(10); linkedList.add(20); linkedList.add(30); linkedList.add(20); System.out.println(删除前 linkedList); // 输出[10, 20, 30, 20] // 默认删除头部元素 linkedList.remove(); System.out.println(删除头部后 linkedList); // 输出[20, 30, 20] // 按索引删除索引1 int removeByIndex linkedList.remove(1); System.out.println(按索引删除的元素 removeByIndex); // 输出30 System.out.println(按索引删除后 linkedList); // 输出[20, 20] // 按元素删除第一次出现的20 linkedList.remove(20); System.out.println(按元素删除后 linkedList); // 输出[20] // 删除尾部元素 int removeLast linkedList.removeLast(); System.out.println(删除的尾部元素 removeLast); // 输出20 System.out.println(删除尾部后 linkedList); // 输出[] } }6. 集合清空clear()与ArrayList的clear()用法一致清空链表中所有元素链表长度变为0对象本身依然存在。import java.util.LinkedList; public class LinkedListTest { public static void main(String[] args) { LinkedListInteger linkedList new LinkedList(); linkedList.add(10); linkedList.add(20); linkedList.add(30); System.out.println(清空前 linkedList); // 输出[10, 20, 30] linkedList.clear(); System.out.println(清空后 linkedList); // 输出[] } }7. 链表长度size()与ArrayList的size()用法一致返回链表中元素的实际个数动态变化。import java.util.LinkedList; public class LinkedListTest { public static void main(String[] args) { LinkedListInteger linkedList new LinkedList(); linkedList.add(10); linkedList.add(20); linkedList.add(30); int size linkedList.size(); System.out.println(链表长度 size); // 输出3 } }三、ArrayList与LinkedList核心差异总结必看很多初学者分不清两者的使用场景核心差异在于底层实现不同导致查询、增删效率不同以下是关键差异对比帮你快速选择对比维度ArrayListLinkedList底层实现动态数组双向链表查询效率高O(1)直接通过索引访问低O(n)需遍历链表增删效率低O(n)需移动后续元素高O(1)仅修改指针内存占用较低数组存储无额外指针开销较高每个元素需存储前后指针适用场景查询频繁、增删较少如数据展示、分页查询增删频繁、查询较少如队列、栈、消息队列四、总结新手必记的使用技巧1. 优先选择ArrayList日常开发中查询场景远多于增删场景ArrayList的查询效率优势更明显是更常用的集合。2. 增删频繁用LinkedList如果需要频繁在集合头、尾添加/删除元素如实现队列LinkedList的效率远高于ArrayList。3. 避免索引越界无论是ArrayList还是LinkedListget()、remove(int index)方法的索引都不能超出集合长度否则会抛出异常。4. 遍历选择两种集合都支持增强for循环和迭代器推荐使用这两种方式避免手动管理索引减少错误。5. 清空集合clear()方法仅清空元素集合对象依然可用若需彻底释放资源可在clear()后将集合赋值为null。ArrayList和LinkedList是Java集合的基础掌握它们的常用方法和核心差异能帮你在开发中选择更合适的集合提升代码效率和可读性。本文的案例均经过验证可直接复制运行建议新手多动手练习熟悉每个方法的用法避免踩坑。

相关文章:

Java集合入门必看:ArrayList与LinkedList常用方法详解(附实战案例)

在Java开发中,集合是日常使用频率极高的工具,而ArrayList和LinkedList作为List接口的两大核心实现类,分别适用于不同的业务场景。很多初学者在使用时,常常混淆两者的方法用法,不清楚何时该用ArrayList、何时该用Linked…...

本地大模型系列:2.通过API让本地大模型为你服务

上一篇我们介绍了ollama和lmstudio,这两个工具都是个人版的运行大模型的工具,可以用来运行本地小参数的LLM(所谓小参数一般指不超过27B的4bit量化LLM,按照1B参与大约需要0.7G显存加载进行预测,加上其他开销月1-1.5G&am…...

Spring AI Alibaba MCP协议实战:模型上下文协议集成与工具调用

Spring AI Alibaba MCP协议实战:模型上下文协议集成与工具调用 导读:MCP(Model Context Protocol,模型上下文协议)是 Anthropic 于 2024 年末发布的开放标准,旨在解决 AI 工具调用的碎片化问题。Spring AI …...

嵌入式信号发生器库:高精度方波生成与载波调制

1. SignalGenerator 库概述SignalGenerator 是一个轻量级、可移植的嵌入式信号发生器开源库,专为资源受限的微控制器设计。其核心目标是在任意 GPIO 引脚上生成高精度、可编程的方波信号,同时支持载波调制(Carrier Modulation)功能…...

XPath 语法完全指南:从基础语法到 SQL 注入中的应用

爬虫、处理过配置文件、或者接触过 MySQL 的 XML 函数的一定都见过 XPath 这个名词。它是一种专门用来在 XML 文档中“寻址”的语言,语法像文件路径一样直观。同时,XPath 是 Web 安全领域中 SQL 报错盲注中的关键角色。一、XPath 是什么?XPat…...

南北阁 Nanbeige 4.1-3B 企业应用方案:私有化部署+对话记忆管理+审计日志扩展接口

南北阁 Nanbeige 4.1-3B 企业应用方案:私有化部署对话记忆管理审计日志扩展接口 想在企业内部部署一个既智能又安全的对话AI吗?今天我们来聊聊如何基于南北阁 Nanbeige 4.1-3B 模型,打造一个功能完备的企业级对话应用。这个方案不仅支持纯本…...

保姆级教程:用Python+Robotics Toolbox搞定Panda机械臂的DH建模与正逆解(附避坑指南)

从零实现Panda机械臂运动学:Python Robotics Toolbox实战指南 机械臂控制是机器人领域的核心技术之一,而运动学建模则是实现精准控制的基础。本文将带您使用Python的Robotics Toolbox,一步步完成Franka Emika Panda机械臂的DH参数建模、正运动…...

【JSReverser-MCP】一句话逆向猿人学21题

近期听闻AI可以做逆向了,于是赶紧来试一试。 相关参考: vibe coding 氛围编程 Vibe coding 用 AI 做 JS 逆向食用教程 JSReverser-MCP 源:https://github.com/NoOne-hub/JSReverser-MCP 安装 环境要求 nodejs v22及以上 已部署Claude code或codex…...

GLM-TTS语音克隆实测:5分钟搞定方言克隆,效果惊艳!

GLM-TTS语音克隆实测:5分钟搞定方言克隆,效果惊艳! 1. 引言:语音克隆技术的新突破 在数字内容爆炸式增长的今天,个性化语音合成技术正成为内容创作者、企业客服、教育机构等领域的刚需。传统语音克隆方案往往需要数小…...

Adafruit ICM20X库详解:ICM20649与ICM20948驱动开发指南

1. 项目概述 Adafruit ICM20X 是 Adafruit 官方维护的 Arduino 兼容库,专为 TDK InvenSense 公司推出的 ICM20649 与 ICM20948 两款高性能 MEMS 运动传感器设计。该库并非通用型 ICM20X 系列驱动,而是聚焦于 Adafruit 自行设计并销售的硬件模块——即 I…...

计算机视觉进阶教学之Mediapipe库(一)

目录 简介 一、Mediapipe Python的安装和应用 二、手部检测 1. 导入必要的库 2. 初始化 MediaPipe 组件 3. 配置并创建手部检测模型实例 4. 启动摄像头并进入主循环 5. 绘制检测结果 三、手势识别 1. 手势识别核心逻辑 a. 计算基准距离 (Base Distance) b. 计算各手…...

Alpamayo-R1-10B开源模型价值:降低L4研发门槛,让算法团队专注因果逻辑而非工程胶水

Alpamayo-R1-10B开源模型价值:降低L4研发门槛,让算法团队专注因果逻辑而非工程胶水 1. 项目概述 Alpamayo-R1-10B是NVIDIA推出的自动驾驶专用开源视觉-语言-动作(VLA)模型,作为一套完整的自动驾驶研发工具链&#xf…...

SmolVLA参数详解:256×256输入分辨率对边缘计算设备的友好性分析

SmolVLA参数详解:256256输入分辨率对边缘计算设备的友好性分析 1. 引言:为什么边缘设备需要紧凑的视觉语言动作模型 在机器人技术和边缘计算领域,我们经常面临一个核心矛盾:强大的AI能力需要大量计算资源,而边缘设备…...

论文AI率突然从20%涨到50%怎么办?紧急处理攻略

论文AI率突然从20%涨到50%怎么办?紧急处理攻略 上周五,一个学妹发消息给我,语气挺崩溃的:“学长,我的论文上个月查AI率才18%,今天重新查直接变成52%了,后天就要交终稿,怎么办啊&…...

密码学算法 - 连分数算法

当你在计算某个数的近似值时🔍,或者在求解某个方程的根时🧮,连分数算法 就像一把神奇的放大镜🔎,能帮你逐步逼近那个隐藏在数字背后的真相。 欢迎来到《密码学核心算法实战》的连分数专题!这里…...

Linux内核构建三要素:Makefile、Kconfig与.config协同机制

1. Linux内核构建系统核心机制解析:Makefile、Kconfig与.config的协同关系在嵌入式Linux开发实践中,内核编译常被视为一道技术门槛。开发者面对庞大的源码树(以Linux-3.4.2为例,包含超过2.5万文件),往往陷入…...

DIY四足机器人入门:用开源项目打造你的第一个仿生机器狗

DIY四足机器人入门:用开源项目打造你的第一个仿生机器狗 四足机器人正从实验室走向创客空间。想象一下,周末午后在自家工作台上组装出一台能行走、奔跑甚至跳舞的机器狗——这不再是科幻场景。得益于MIT Mini Cheetah等开源项目的出现,普通爱…...

HAR实战指南:从Kinetics-400数据集获取到视频帧预处理全流程解析

1. Kinetics-400数据集入门指南 第一次接触Kinetics-400数据集时,我被它庞大的规模震撼到了。这个包含40万段视频片段的数据集,涵盖了从"打篮球"到"刷牙"等400种日常动作,是训练人体动作识别(HAR)模型的黄金标准。但随之…...

通义千问3-Reranker-0.6B模型压缩:基于TensorRT的推理加速

通义千问3-Reranker-0.6B模型压缩:基于TensorRT的推理加速 1. 为什么需要对Qwen3-Reranker做TensorRT优化 你可能已经试过直接加载Qwen3-Reranker-0.6B跑重排序任务,但很快会发现:推理速度不够快,显存占用偏高,尤其在…...

2026年AI提示词(Prompt)终极指南:国内聚合站实战技巧

在AI应用日益深入的2026年,能否写出高质量的提示词(Prompt),直接决定了你从GPT、Claude、Gemini等大模型中获得价值的效率与深度。对于国内用户,学习和实践提示词工程的最佳平台是聚合型AI镜像站。目前,通过…...

大模型学习笔记------SAM模型架构拆解与实战指南

1. SAM模型架构全景拆解 第一次接触SAM模型时,我被它"分割一切"的野心震撼到了。这就像给计算机视觉领域扔下了一颗原子弹——传统需要专门训练的分割任务,现在通过提示词就能实时完成。在实际部署医疗影像标注系统时,我发现理解这…...

读了Linux内核slab源码,发现Linus在20年前就写出了比std::pmr更高效的内存池——内核内存管理的4个设计模式

一、C++的内存池,和内核比差在哪? C++程序员对内存管理不陌生。从最基本的new/delete,到C++17引入的std::pmr::polymorphic_allocator,再到各种第三方库的对象池实现,我们一直在和内存分配器打交道。 但你有没有想过一个问题:为什么C++标准库直到2017年才搞出std::pmr这…...

Dify + Celery + Webhook深度集成:构建高可靠异步管道的6大关键配置点

第一章:Dify自定义节点异步处理的核心架构演进Dify 自 v0.6.10 起将自定义节点(Custom Node)的执行模型从同步阻塞式全面转向基于事件驱动的异步处理架构,其核心目标是解耦节点执行与工作流调度,提升高并发场景下的资源…...

JTAG接口原理、失效诊断与硬件防护实战指南

1. JTAG接口原理与工程实践深度解析在嵌入式系统与可编程逻辑器件的开发流程中,JTAG(Joint Test Action Group)接口不仅是调试与烧录的核心通道,更是硬件工程师验证设计完整性、定位物理层故障的关键工具。本文基于FPGA开发中频繁…...

STM32电机控制库5.4版:开源无感驱动注释详解——从寄存器设置到弱磁控制策略实现

STM32电机库5.4开源无感注释 KEIL工程文件 辅助理解ST库 寄存器设置AD TIM1 龙贝格PLL 前馈控制 弱磁控制 foc的基本流 svpwm占空比计算方法 斜坡启动 死区补偿 有详细的注释, 当前是无传感器版本龙贝格观测,三电阻双AD采样!搞STM32电机控制就像在玩硬件…...

高效掌握SeisUnix:从架构解析到实战应用

高效掌握SeisUnix:从架构解析到实战应用 【免费下载链接】SeisUnix The CWP/SU: Seismic Un*x Package - a free open seismic processing, research, and educational software package. Please seek distribution gzipped tar files at https://wiki.Seismic-Unix…...

Windows任务栏美化:TranslucentTB打造个性化视觉体验

Windows任务栏美化:TranslucentTB打造个性化视觉体验 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 在Windows桌面个性化领域…...

嵌入式可观测性库:面向教学的轻量级实时调试方案

Elec350_OBS:面向嵌入式教学的实时观测与调试库深度解析1. 项目概述Elec350_OBS 是为加拿大麦吉尔大学(McGill University)ELEC 350 ——《嵌入式系统设计导论》课程配套开发的轻量级观测(Observability)支持库。该库并…...

C语言实现OTA安全降级与故障隔离:3层状态持久化+2次幂回退重试,让固件升级不再“一失足成千古恨”

第一章:C语言OTA升级失败处理的总体设计哲学在资源受限的嵌入式系统中,C语言实现的OTA升级失败处理并非简单的错误重试逻辑,而是一种以**确定性、可回滚性与状态自明性**为核心的系统级设计哲学。它要求每个操作步骤都具备原子边界&#xff0…...

Mos:3大核心技术彻底解决macOS鼠标滚动的终极体验难题

Mos:3大核心技术彻底解决macOS鼠标滚动的终极体验难题 【免费下载链接】Mos 一个用于在 macOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板 | A lightweight tool used to smooth scrolling and set scroll direction independently f…...