- 博客(289)
- 收藏
- 关注
原创 Spring Boot 整合 ChatGPT API:后端快速开发 AI 问答接口,附签名验证 + 限流
本文将详细讲解如何基于 Spring Boot 实现 ChatGPT API 的整合,包括核心接口开发、签名验证机制(防止非法调用)、流量限流(避免资源过载),并提供完整的代码示例与部署建议,确保方案具备生产级可用性。本文通过 Spring Boot 整合 ChatGPT API,完成了 AI 问答接口的开发,并通过签名验证保障了接口安全,通过限流控制了请求频率,方案具备生产级可用性。创建ChatGptService,封装 ChatGPT API 的调用细节,包括请求参数构建、响应解析与异常处理:。
2025-08-24 09:54:51
1168
原创 React+Next.js 搭建 SEO 友好型博客:JS 服务端渲染实战,谷歌收录率提升 90%
而谷歌等搜索引擎的爬虫虽然能执行部分 JS,但对于复杂的动态内容(如异步加载的博客文章、评论),抓取效率极低,甚至可能直接忽略未及时渲染的内容,导致大量优质文章 “隐形”,收录率往往不足 10%。结构化数据是谷歌推荐的 “增强型 SEO” 手段,通过特定格式的 JSON-LD 代码,向谷歌传递页面的结构化信息(如文章作者、发布时间、评论数),让搜索结果展示更丰富(如显示发布日期、作者名称),吸引用户点击的同时,提升谷歌对页面的信任度。具体优势体现在三个方面:。针对博客内容,需注意:。
2025-08-24 09:47:16
1022
原创 JS 操作 LocalStorage 的 5 个技巧:防覆盖 + 过期清理 + 容量监控,避免踩坑
通过上述 5 个技巧,我们构建了一套从 “数据安全存储” 到 “生命周期管理” 再到 “容量控制” 的完整解决方案:命名空间和存在性校验解决了 “防覆盖” 问题,过期机制实现了 “无效数据自动清理”,容量监控和降级策略避免了 “溢出报错”。同时提供主动清理所有过期数据的方法,定期释放空间。业务适配:优先级的定义需结合业务场景 —— 例如 “用户登录态” 设为 “high”,“浏览历史” 设为 “low”,“商品缓存” 设为 “medium”;四、技巧 4:实时监控容量使用情况,避免 “写入溢出” 报错。
2025-08-24 09:43:19
626
原创 JS 异步编程进阶:Promise/async/await 实战场景对比,这 5 个案例帮你彻底搞懂
分析:async/await 结合Promise.race实现限流,逻辑更接近 “人类思维”—— 先启动 5 个请求,用Promise.race等待第一个完成的任务,处理完后从 “运行中” 队列移除,再补一个新请求,直到所有任务完成。而 async/await 是 Promise 的 “语法糖”,进一步降低了异步逻辑的理解成本。场景需求:开发搜索组件时,用户输入关键词后会触发/api/search请求,但用户快速输入时(如 “手机”→“手机壳”),前一个未完成的请求会浪费资源,且可能返回旧结果覆盖新结果。
2025-08-24 09:35:51
680
原创 React Hooks 避坑:useEffect 依赖项写错导致的 2 个经典 bug,看完再也不踩
同时,副作用函数中用到的所有 “外部变量”(包括组件状态、 props、函数),都必须加入依赖项数组,否则会导致闭包陷阱。此时,每次count更新后,React 会检测到依赖项变化,重新执行 useEffect:清除上一个定时器,创建新的定时器,新定时器的回调函数会捕获最新的count值,从而实现正常的倒计时。类似的问题还会出现在依赖 “函数” 时:若在组件内部定义函数(如const handleFetch = () => {}),每次渲染都会创建新的函数引用,若将其加入依赖项,也会触发无限循环。
2025-08-24 09:33:15
713
原创 用 JS+Canvas 做个 “粒子动效背景”,复制粘贴就能用,网站逼格瞬间拉满
Promise 的Promise.allSettled()是处理 “部分错误容忍” 场景的核心 API,它会等待所有 Promise 完成(无论fulfilled还是rejected),并返回每个任务的结果对象(包含status和value/reason),开发者可按需处理成功与失败的任务。Promise 的Promise.race()是超时控制的核心 API,它接收一个 Promise 数组,第一个状态改变的 Promise会决定Promise.race()的结果(无论成功或失败)。
2025-08-24 09:29:22
508
原创 JS 异步编程进阶:Promise/async/await 实战场景对比,这 5 个案例帮你彻底搞懂
Promise 的Promise.allSettled()是处理 “部分错误容忍” 场景的核心 API,它会等待所有 Promise 完成(无论fulfilled还是rejected),并返回每个任务的结果对象(包含status和value/reason),开发者可按需处理成功与失败的任务。Promise 的Promise.race()是超时控制的核心 API,它接收一个 Promise 数组,第一个状态改变的 Promise会决定Promise.race()的结果(无论成功或失败)。
2025-08-23 20:35:30
1025
原创 MySQL 事务隔离级别详解!用例子讲透脏读、不可重复读、幻读
定义:事务 A 在同一执行过程中,多次按相同条件查询范围数据,若事务 B 在两次查询之间插入或删除了符合条件的记录,事务 A 会发现查询结果的行数发生变化,如同出现 “幻觉”,即 “幻读”。场景示例:某电商平台统计库存表(product_stock)中 “库存小于 10 件” 的商品数量,事务 A 执行统计操作,事务 B 在中间插入一条符合条件的记录:。场景示例:仍以用户账户表为例,事务 A 需要分两步核对用户余额(先查询余额,再验证是否满足消费条件),事务 B 在中间执行余额修改:。
2025-08-23 20:29:58
1007
原创 Java 操作 Redis 缓存!实战案例:实现「热点数据缓存」,减轻数据库压力
本文将通过「电商商品详情页热点缓存」这一典型场景,完整讲解 Java 如何整合 Redis 实现热点数据缓存,从环境搭建到代码落地,再到缓存问题优化,全程覆盖实战细节。从结果可见:开启 Redis 缓存后,数据库 QPS 从 890 降至 32,CPU 使用率从 95% 降至 12%,接口响应时间从 120ms 缩短至 8ms,数据库压力降低 96% 以上,缓存效果显著。Service 层是缓存逻辑的核心,需实现「缓存查询 - 命中判断 - 数据库查询 - 缓存更新」的完整流程,同时解决缓存三大问题:。
2025-08-23 20:19:39
864
原创 Java 注解原理详解!自定义注解 + 反射实战,让代码更简洁
从基础的元注解认知到复杂的反射实战,注解的学习需要结合理论与实践。在实际开发中,我们不仅要会使用框架提供的注解,更要能根据业务需求自定义注解,例如实现接口参数校验、方法性能监控等功能,真正发挥注解的价值,提升开发效率与代码质量。解析器的核心逻辑是:通过Method对象获取注解,记录方法调用前的时间,执行方法,再记录返回值和耗时:。当调用这些方法时,JVM 会从方法区的注解缓存区中读取对应的注解信息,并实例化注解对象,开发者即可通过注解对象获取其属性值,进而实现自定义逻辑(如日志记录、权限校验等)。
2025-08-23 20:10:27
603
原创 Java 操作 Redis 缓存!实战案例:实现「热点数据缓存」,减轻数据库压力
在高并发业务场景中,数据库往往是系统性能的 “瓶颈”—— 比如电商平台的商品详情页、新闻网站的热点资讯、秒杀活动中的库存查询,这些场景下同一批数据会被反复请求,若每次请求都直接穿透到数据库,会导致数据库连接数飙升、查询响应延迟,严重时甚至引发数据库宕机。这类数据的访问特征是 “读多写少”,且访问量集中,若不做缓存处理,会带来两大核心问题:。在业务层(Service)中实现 “缓存优先” 的查询逻辑,同时处理 “缓存更新” 场景(当商品数据修改时,需同步更新缓存,避免缓存与数据库数据不一致):。
2025-08-23 20:05:44
719
原创 用 Java 写个「学生管理系统」!SSM 框架 + MySQL,附完整项目结构
现象:程序运行中突然抛出 “java.lang.OutOfMemoryError: Java heap space”,GC 日志显示 Full GC 频繁执行,且老年代内存始终处于高占用状态。JVM 内存结构分为堆、方法区(元空间)、虚拟机栈、本地方法栈和程序计数器,其中堆和元空间是内存溢出的高发区域,对应的参数配置直接影响内存使用效率。官网:http://WWW.XINSHIJIEHOTEL.CN/官网:http://WWW.dzzsp.com.cn/
2025-08-23 19:54:25
576
原创 用 Java 写个「学生管理系统」!SSM 框架 + MySQL,附完整项目结构
本文详细介绍了基于 SSM 框架和 MySQL 的学生管理系统的开发过程,从技术栈选型、项目结构设计、环境搭建,到核心模块(学生管理)的代码实现,再到功能测试和优化建议,覆盖了项目开发的全流程。该系统实现了学生信息的增删改查、分页、搜索等基础功能,同时具备良好的可扩展性,开发者可在此基础上扩展课程管理、成绩管理、用户管理等模块,或通过引入新技术(如 Redis、Spring Security、Vue.js)进一步提升系统的性能和安全性。TypeScript取消自动换行复制。
2025-08-23 19:49:11
596
原创 手机端 JS 适配痛点?3 个方案解决「触摸事件 + 屏幕适配」问题
然而,JS 开发中「触摸事件」与「屏幕适配」两大模块的适配问题,却常让开发者陷入困境 —— 触摸反馈延迟导致操作卡顿、不同设备屏幕显示错乱、事件冲突引发误触发等问题,不仅影响用户体验,还会增加开发与维护成本。该 API 将触摸、鼠标、手写笔等输入方式统一为「指针事件」,既能消除 300ms 延迟,又能避免事件冲突,同时具备良好的兼容性。但只要掌握「事件统一」「动态适配」「兼容性降级」的核心思路,就能灵活应对新场景,打造流畅、一致的手机端体验。手机屏幕的「碎片化」是适配的另一大难题,具体表现为:。
2025-08-23 19:45:29
880
原创 JS 异步编程避坑指南!Promise/async/await 常见错误及解决方案
问题根源:每个then都会返回新的 Promise,若前一个then抛出错误且未在当前then的第二个参数或后续catch中处理,错误会沿链传递,可能导致中间逻辑跳过,仅在最终catch中暴露,增加调试难度。问题根源:Promise.all具有 “快速失败” 特性,只要有一个 Promise 被reject,就会立即触发catch,且不会返回其他已成功的结果,不适用于允许部分任务失败的场景(如仪表盘数据加载)。错误场景:使用Promise.all处理多个独立异步任务时,单个任务失败导致所有结果被丢弃:。
2025-08-23 19:42:40
1174
原创 解决 JS 移动端适配痛点:2 行代码实现 “rem 自适应布局”,适配所有手机屏幕
比如,在 750px 宽的设计稿中,HTML 的 font-size 就是 75px(750px/10),此时 1rem=75px,开发者在编写 CSS 时,只需将设计稿上的像素值除以 75,就能得到对应的 rem 值。按照 “1rem = 设计稿宽度 / 10=75px” 的换算规则,我们只需将设计稿上的像素值除以 75,就能得到对应的 rem 值 —— 元素宽度为 2rem(150px/75)、高度为 1rem(75px/75)、字体大小为 0.4rem(30px/75)。
2025-08-23 19:35:16
716
原创 JS+Fetch API 实战:对接后端接口,实现 “用户登录 + Token 存储” 完整流程
本文将以原生 JavaScript 结合 Fetch API 为工具,从零搭建 “用户登录 + Token 存储” 的完整流程,不仅覆盖代码实现细节,还会深入讲解背后的技术原理,帮助开发者理解每一步的设计逻辑,轻松应对实际项目中的接口对接需求。相比 XHR,Fetch API 的核心优势在于:。当用户首次登录成功后,后端会返回 Token,前端将其存储在本地,后续所有需要身份验证的请求,都需在请求头中携带 Token,后端通过验证 Token 的有效性来判断用户是否有权访问接口。核心要点总结如下:。
2025-08-23 19:31:23
1272
原创 用 JS 开发 Chrome 插件:10 分钟做一个 “网页广告自动屏蔽工具”,附完整源码
其实借助 Chrome 插件的开放能力,用简单的 JavaScript 代码就能开发一款广告自动屏蔽工具,无需复杂的后端逻辑,仅需配置核心文件和编写基础交互代码,10 分钟即可实现核心功能。规则格式需遵循 Chrome 规范,以下是常见的广告拦截规则,涵盖广告服务器域名、广告资源类型(如图片、脚本、弹窗):。Chrome 插件(现称 “扩展程序”)本质是由 HTML、CSS、JavaScript 和配置文件组成的压缩包,其运行依赖manifest.json配置文件(相当于插件的 “身份证”)。
2025-08-23 19:24:27
1490
原创 易语言避坑:组件命名规范 + 代码注释技巧,新手也能写整洁代码
对于易语言新手来说,从一开始就养成良好的编码习惯,比单纯追求功能实现更重要 —— 整洁的代码不仅是 “能跑通”,更是 “好维护、好理解”,这才是新手成长为资深开发者的关键一步。如果说组件命名是代码的 “骨架”,那注释就是代码的 “肌肉”,能让其他人(包括未来的自己)快速理解代码逻辑。刚开始可以在项目文件夹里建一个 “组件命名表”,列出常用组件的前缀和示例,比如 “按钮:btn_功能”“编辑框:edt_内容”,写代码时对照表格命名,慢慢形成习惯。例如 “计算学生平均分” 的代码注释:。
2025-08-23 19:17:57
984
原创 Java 面试:HashMap 底层原理?JDK1.7 vs 1.8 区别,讲透拿 offer
原哈希值与原容量(16)按位与,若结果为 0,新索引 = 原索引;JDK1.7 中,HashMap 的底层结构是数组(Entry 数组,名为 table)+ 链表的组合,这种结构被称为 “哈希表的链地址法”,用于解决哈希冲突(即不同 Key 计算出相同哈希值时的存储问题)。JDK1.8 认为 JDK1.7 的多次扰动 “过度”,且现代 CPU 对高位运算的支持更好,因此简化了哈希计算:。JDK1.8 的扩容触发条件与 JDK1.7 一致(size >= 容量×负载因子),但扩容流程有两处关键优化:。
2025-08-23 19:12:19
983
原创 Java8 新特性必学:Lambda 表达式 + Stream API,代码量减少 50%
当然,Lambda 表达式与 Stream API 的功能远不止本文所介绍的内容,例如 Stream API 中的groupingBy()(分组)、joining()(字符串拼接)、reduce()(归约)等高级操作,以及 Lambda 表达式与方法引用、构造器引用的结合使用,都能进一步简化代码。在传统集合操作中,若要实现 “筛选出薪资大于 15000 的技术部员工,提取他们的姓名并按薪资降序排序,最后统计人数”,需要编写大量的循环和判断代码:。而使用 Stream API 后,代码简化为:。
2025-08-23 19:08:29
675
原创 SpringBoot 整合 Redis 缓存:Java 实现高并发下的缓存穿透解决方案
在RedisConfig的cacheManager方法中,将disableCachingNullValues()改为enableCachingNullValues(),并单独配置空值的过期时间(建议短于正常数据,避免占用过多缓存空间):。此处以 Guava 为例:。在实际项目中,建议采用 “参数校验 + 布隆过滤器 + 缓存空值” 的组合方案:参数校验拦截明显非法请求,布隆过滤器拦截大部分无效合法请求,缓存空值处理布隆过滤器的误判请求,形成多层防护。以用户查询业务为例,演示缓存注解的使用:。
2025-08-23 19:05:03
622
原创 SpringBoot+Java 实战:10 分钟搭建一个 RESTful 接口,新手也能跑通
至此,我们用 10 分钟左右完成了一个完整的 RESTful 接口开发:从环境准备到项目创建,再到接口编写和测试,整个过程没有复杂的 XML 配置,全靠 SpringBoot 的自动配置简化操作。解决:检查 IDEA 的 Maven 配置(是否指向本地 Maven 和修改后的 settings.xml),重启 IDEA 并点击 “Reload All Maven Projects”(右上角刷新按钮)。代码如下(自动生成,无需修改):。这里以 IDEA 为例:。
2025-08-23 19:00:06
1066
原创 用 JS 写个「倒计时秒杀组件」:处理时区偏差 + 防止作弊,电商项目必用
此外,需定时(如每 30 秒)重新获取服务端时间,校准客户端的 “时间漂移”—— 因客户端setInterval存在误差(如页面切换至后台时定时器暂停),长时间运行后会导致倒计时偏差。在实际项目中,还需结合业务场景调整细节(如多语言、多时区展示),并通过压测验证服务端接口的稳定性 —— 毕竟秒杀活动高峰期,每秒可能有上万次倒计时请求,服务端的并发处理能力同样至关重要。通过 AJAX/axios 请求服务端接口,返回当前服务器时间戳(如1724380800000,毫秒级),示例代码:。
2025-08-23 18:57:00
938
原创 MySQL 和 PostgreSQL 到底谁更强?从性能、功能、生态 3 方面对比,结果意外
此外,由于 MySQL 的广泛应用,市场上也存在大量的第三方管理工具,这些工具在功能上各有特色,例如有的工具在数据备份和恢复方面具有优势,有的工具则专注于性能监控和优化。除了 pgAdmin,还有一些其他的第三方管理工具,如 DBeaver 等,也对 PostgreSQL 提供了良好的支持,这些工具通常具有更丰富的功能和个性化的设置选项,满足不同开发者的需求。在一些对性能要求不是特别高,但需要快速开发和上线的初创企业项目中,MySQL 也是一个不错的选择,它能够帮助企业快速实现业务功能,降低开发成本。
2025-08-22 17:42:53
1532
原创 Java 性能调优实战:JVM 参数调对了,项目响应时间从 5 秒降到 500 毫秒
在一个电商平台的订单处理系统中,开发团队曾面临一个棘手的问题:用户提交订单后,系统平均响应时间长达 5 秒,高峰期甚至出现超时失败的情况。从 5 秒到 500 毫秒的性能跨越,本质上是让 JVM 的运行机制与订单系统的对象生命周期特性相匹配 —— 通过内存分配策略减少对象晋升,借助 G1 收集器的 Region 化管理实现精准回收,最终达成 “垃圾早回收、内存少浪费、停顿可控制” 的理想状态。在测试环境进行压测验证时,团队使用 JMeter 模拟 500 用户并发下单场景,对比调优前后的关键指标:。
2025-08-22 17:40:53
651
原创 从 “Java 之父” 离职到 Oracle 收费,Java 的未来到底在哪里?业内人分析
当被问到离开 Oracle Java 的原因时,53% 的人吐槽收费太贵,对开源的偏爱(47%)和 Oracle 不断调整 Java SE 价格带来的不确定性(38%)也是主要原因,Java 审计的威胁在受访者中的得分也很高(25%)。总体而言,尽管从 “Java 之父” 离职到 Oracle 收费,一系列事件给 Java 的发展带来了诸多挑战,但 Java 凭借其深厚的技术积累、庞大的开发者社区、持续的技术创新以及在企业级应用等核心领域的不可替代地位,在未来依然有着广阔的发展空间。
2025-08-22 17:38:24
592
原创 用 Java+Spring Boot 开发一个 RESTful API,从搭建到部署全流程,超详细
Java 语言凭借成熟的生态和强大的性能,成为开发企业级 API 的首选,而 Spring Boot 框架则进一步简化了开发流程,让开发者能够快速构建可扩展的 RESTful 服务。最后,Maven 作为项目构建工具,需确保配置文件(settings.xml)中设置了阿里云镜像,加快依赖下载速度,配置内容如下:。实际开发中,还可根据需求进行扩展,例如:。以用户管理 API 为例,创建 User 实体类,使用 JPA 注解映射数据库表,Lombok 注解简化 getter、setter 等方法:。
2025-08-22 17:36:53
884
原创 Java 集合框架大梳理:ArrayList vs LinkedList,选错性能差 100 倍
ArrayList 的内存开销主要体现在数组的冗余容量上,为了减少频繁扩容的成本,它会预留一定的空闲空间(例如初始容量为 10,当元素达到 10 个时会扩容至 15),这些未使用的空间在内存紧张的场景下可能成为负担。此外,ArrayList 存储的是元素本身(或对象引用),内存布局连续,缓存友好性更强 ——CPU 在读取元素时,会将相邻的元素一并加载到缓存中,后续访问相邻元素时无需再从内存读取,这在遍历操作中能显著提升效率。值得注意的是,JDK 的不断优化正在模糊两者的边界。
2025-08-22 17:31:58
345
原创 Java 面试必问:HashMap 底层原理,从数组 + 链表到红黑树,一文读懂
在 JDK 1.8 之前,HashMap 通过链表来处理冲突:数组的每个桶中存储链表的头节点,新插入的冲突元素会被添加到链表的尾部(JDK 1.7 及之前为头部插入,存在并发死链问题,1.8 改为尾部插入)。为解决长链表的查询效率问题,JDK 1.8 引入了红黑树(Red-Black Tree)结构:当链表长度超过阈值(默认为 8,TREEIFY_THRESHOLD),且数组容量不小于 64(MIN_TREEIFY_CAPACITY)时,链表会被转换为红黑树。三、红黑树:JDK 1.8 的性能优化。
2025-08-22 17:29:14
1261
原创 浏览器控制台不止 console.log!这些隐藏功能,能让你少写 500 行代码
比如调试一个复杂的表单元素时,用 console.dir (inputElement) 能直接看到其 value、checked、disabled 等状态,无需再写 document.getElementById ('input').value 这样的代码去逐个验证。类似地,$$('div') 等价于 document.querySelectorAll ('div'),但返回的是数组而非 NodeList,直接支持 forEach 等数组方法,省去了转换步骤。比如测试一个函数的执行效率:。
2025-08-22 17:27:39
483
原创 用 MySQL 实现 “消息通知系统”,基于TIMESTAMP和索引优化
在现代应用中,消息通知系统是连接用户与平台的重要桥梁,无论是社交软件的私信提醒、电商平台的订单状态更新,还是办公系统的任务通知,都需要高效、可靠的底层支撑。消息通知系统的核心需求包括:实时性(消息需及时触达用户)、可靠性(不丢失消息)、可扩展性(支持多种通知类型)以及高效查询(用户能快速获取未读消息)。可基于created_at字段设置定时任务,清理过期消息(如保留 30 天内的消息):。消息通知系统的核心操作包括写入消息(高并发场景下的 INSERT)和查询消息(按用户 ID、状态、时间筛选)。
2025-08-22 17:23:43
878
原创 MySQL 存储过程有多香?用它实现复杂业务逻辑,减少接口调用
例如,在银行的转账业务中,需要完成扣减转出账户金额、增加转入账户金额、记录转账日志等操作,存储过程可以将这些操作包含在一个事务中,一旦其中任何一个步骤出现错误(如转出账户余额不足),整个事务都会回滚,保证账户数据的准确性。若存储过程设计不合理,可能会增加数据库的负担,影响整体性能。例如,在金融系统的利息计算模块中,需要根据用户的存款期限、金额、是否为 VIP 客户等多种条件计算利息,存储过程可以通过嵌套的条件判断和循环轻松实现这一逻辑,而无需在应用程序和数据库之间进行多次数据传输。
2025-08-22 17:20:44
391
原创 Java 8 Lambda 表达式:一行代码搞定集合排序,太香了
Java 8 的Comparator接口新增了一系列静态方法,如comparing()、comparingInt()、comparingDouble()等,这些方法可以直接根据对象的字段生成比较器,结合 Lambda 表达式使用能让代码更简洁。对于 Java 开发者而言,这种 “香” 不仅是语法层面的简洁,更是编程思维的升级 —— 从面向对象的 “怎么做”(编写实现类)转向函数式的 “做什么”(描述比较逻辑),让代码更贴近业务需求本身。例如,对字符串按 “长度优先,首字母其次” 排序:。
2025-08-22 17:19:08
501
原创 避免 OOM!Java 内存泄漏的 8 种常见场景及解决方案
由于静态变量的生命周期与 JVM 一致,一旦将对象存入静态集合,若未主动移除,这些对象会一直被集合引用,即使不再使用也无法被 GC 回收。在 GUI 编程或事件驱动框架中,若注册的监听器(Listener)或回调(Callback)未及时移除,会导致被监听对象与监听器形成引用环,引发内存泄漏。单例模式的生命周期与 JVM 一致,若单例对象持有外部短生命周期对象的引用,会导致外部对象无法被回收,从而引发内存泄漏。五、线程局部变量(ThreadLocal)的滥用。TypeScript取消自动换行复制。
2025-08-22 17:15:42
553
原创 Java 集合框架面试题:ArrayList 与 LinkedList 的核心区别
例如在节点 A 和节点 B 之间插入节点 C 时,只需将 A 的 next 指针指向 C,C 的 prev 指针指向 A,C 的 next 指针指向 B,B 的 prev 指针指向 C,整个过程无需移动其他元素。而 LinkedList 则适用于频繁在头部或中间位置进行增删,且随机访问需求较少的场景,例如实现队列(Queue)、栈(Stack)、双向队列(Deque)等数据结构(Java 中的 LinkedList 同时实现了 Deque 接口,提供了丰富的首尾操作方法)。
2025-08-22 17:13:38
419
原创 被低估的requestAnimationFrame:JS 动画性能优化的终极方案
setInterval虽然能按固定间隔触发回调,但同样无法规避主线程阻塞的问题,且可能出现多个回调函数堆积执行的情况 —— 当某次回调执行时间超过设定间隔时,后续回调会在主线程空闲后连续触发,造成动画 “跳帧”。更关键的是,定时器的时间间隔是开发者手动设定的(通常为 16ms,对应 60fps),但浏览器的实际渲染频率受设备刷新率(如 60Hz、120Hz)影响,固定间隔的更新无法与渲染节奏同步。例如,在列表动画中,一次性更新所有列表项的位置,而非逐个修改。可通过以下代码添加降级处理:。
2025-08-22 17:08:38
492
原创 易语言与其他语言混编:调用 C++ 动态库,扩展功能
对于 C++ 而言,创建动态库可以将核心的高性能功能封装起来,供其他编程语言调用,而易语言则能通过调用这些动态库,借助 C++ 的强大功能提升自身程序的性能与功能。易语言与 C++ 混编,通过调用 C++ 动态库扩展功能,不仅可以充分发挥易语言在快速开发和中文编程方面的优势,还可以借助 C++ 在性能和底层操作方面的强大能力,从而开发出功能更加强大、性能更加优越的应用程序。此外,参数类型的匹配也至关重要,易语言和 C++ 的参数类型虽然有一定的对应关系,但在实际使用中需要仔细核对,例如 C++ 中的。
2025-08-22 16:43:10
1318
原创 易语言做一个 “微信自动回复机器人”,基于网页版接口
在开发和使用微信自动回复机器人的过程中,需要注意以下几点:首先,微信官方明确禁止使用非官方接口进行自动化操作,此类行为可能导致账号被封禁,因此开发的机器人应仅用于个人学习和研究,避免用于商业用途或频繁发送垃圾信息。自动回复功能是机器人的核心,其实现逻辑是根据预设的规则对收到的消息进行处理,并生成相应的回复内容。在易语言中实现简单匹配,可通过建立一个关键词 - 回复内容的映射表(如使用数组或字典),当收到文本消息时,遍历映射表中的关键词,若消息内容包含某个关键词,则使用对应的回复内容进行回复。
2025-08-22 09:47:40
1007
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅